在自然语言处理(NLP)和信息检索领域,TF-IDF(Term Frequency-Inverse Document Frequency,词频-逆文档频率)是一种常用的文本权重计算方法。它能够衡量单词在文档中的重要性,并在文本分类、关键词提取、搜索引擎等多个领域广泛应用。
TF-IDF 是一种经典的文本表示方法,能够衡量单词在文档中的重要性。它在信息检索、文本分类和关键词提取等任务中广泛应用。然而,它无法捕捉语义信息,通常与词向量(如 Word2Vec、BERT)等方法结合使用,以提高文本分析的效果
TF-IDF 主要用于评估某个词语在一篇文档中的重要性,基本思想是:
通过 TF 和 IDF 的结合,我们可以计算出一个词的重要性,常见应用包括:
TF-IDF 的计算包含两个部分:
词频用于衡量某个单词在一篇文档中出现的频率。常见的计算方法如下:
$$ TF(t, d) = \frac{f(t, d)}{\sum_{w \in d} f(w, d)} $$
其中:
逆文档频率用于衡量某个单词在整个文档集合中是否具有区分度。其计算公式为:
$$ IDF(t) = \log \frac{N}{1 + DF(t)} $$
其中:
最终,TF-IDF 计算公式为:
$$ TFIDF(t, d) = TF(t, d) \times IDF(t) $$
假设我们有如下三篇文档:
文档 1: “机器学习 是 人工智能 的 一个 分支”
文档 2: “深度学习 是 机器学习 的 一个 重要 方向”
文档 3: “自然语言处理 是 人工智能 的 一个 重要 领域”
计算 “机器学习” 在 文档 2 中的 TF-IDF 值:
✅ 计算简单,易于理解和实现。
✅ 在搜索引擎和文本分析任务中表现良好。
✅ 适用于高维文本数据。
❌ 无法捕捉单词的语义信息,例如 “苹果” 可以指水果也可以指公司。
❌ 对长文本不够鲁棒,容易造成高频词权重偏高。
❌ 不能处理同义词、上下文信息,需要结合词向量等方法。
Python 提供了 sklearn.feature_extraction.text.TfidfVectorizer
方便计算 TF-IDF,示例如下:
1 | from sklearn.feature_extraction.text import TfidfVectorizer |
多生成器架构是为了解决模式崩溃和提高生成样本多样性而提出的一种方法。与单一生成器的训练方式不同,多生成器架构通过引入多个生成器,在同一个GAN模型中同时训练多个生成器,并让它们互相竞争或合作,共同提高生成的样本质量和多样性。
在传统的单生成器模型中,生成器通常会为了骗过判别器而选择生成某些“简单”的样本,导致生成样本的多样性受到限制,最终出现模式崩溃。通过引入多个生成器,每个生成器可以专注于生成不同种类的数据,避免过度拟合到某一类样本,从而提高生成器在多样性方面的表现。
多生成器架构的工作方式通常是:
这种方法虽然能有效增加生成样本的多样性,但也带来了更高的计算成本,因为需要同时训练多个生成器,这使得训练过程更加复杂,且对计算资源的要求更高。
层归一化就是对每个样本的所有特征进行归一化处理,而不是像批归一化那样对一批数据的同一特征维度进行归一化。
层归一化的原理是通过对每个样本的特征进行独立处理,计算每个样本在所有特征上的均值和方差,然后对该样本进行归一化。这样,每个样本在其所有特征维度上的值都会被调整到一个相对统一的尺度。
这种方法的好处在于,它消除了批次大小的依赖,适用于那些批次大小较小或者批次中样本数量不一致(NLP)的任务。对于RNN、Transformer等序列模型来说,层归一化表现尤为出色,因为这些模型的输入数据通常是具有时序性质的,批归一化可能会在这种情况下丧失时序信息。
层归一化相较于批归一化,在模型训练过程中更适合处理长序列数据。层归一化则能够确保每个样本的特征独立归一化,从而保持模型在每个时刻的数据分布稳定。
比如:
假设我们有一个 批次大小为 2,序列长度为 3,隐藏维度为 4 的输入张量:
[
X \in \mathbb{R}^{\text{Batch_size} \times \text{Seq_len} \times \text{Dim}}
]
假设数据如下:
[
X =
\begin{bmatrix}
\begin{bmatrix} 1.0 & 2.0 & 3.0 & 4.0 \end{bmatrix} \
\begin{bmatrix} 5.0 & 6.0 & 7.0 & 8.0 \end{bmatrix} \
\begin{bmatrix} 9.0 & 10.0 & 11.0 & 12.0 \end{bmatrix}
\end{bmatrix}
]
计算层归一化
层归一化是在 每个 token(每一行) 内部进行归一化,即 沿着 Dim
维度计算均值和标准差。
第一个 token:([1.0, 2.0, 3.0, 4.0])
计算均值
[
\mu = \frac{1.0 + 2.0 + 3.0 + 4.0}{4} = 2.5
]
计算标准差
[
\sigma = \sqrt{\frac{(1.0 - 2.5)^2 + (2.0 - 2.5)^2 + (3.0 - 2.5)^2 + (4.0 - 2.5)^2}{4}}
]
[
= \sqrt{\frac{2.25 + 0.25 + 0.25 + 2.25}{4}} = \sqrt{1.25} \approx 1.12
]
归一化
[
\hat{x} = \frac{x - \mu}{\sigma} = \left[ \frac{1.0 - 2.5}{1.12}, \frac{2.0 - 2.5}{1.12}, \frac{3.0 - 2.5}{1.12}, \frac{4.0 - 2.5}{1.12} \right]
]
[
\approx [-1.34, -0.45, 0.45, 1.34]
]
第二个 token:([5.0, 6.0, 7.0, 8.0])
[
\mu = \frac{5+6+7+8}{4} = 6.5, \quad \sigma = \sqrt{\frac{(-1.5)^2 + (-0.5)^2 + (0.5)^2 + (1.5)^2}{4}} = 1.12
]
[
\hat{x} = \left[ \frac{5.0 - 6.5}{1.12}, \frac{6.0 - 6.5}{1.12}, \frac{7.0 - 6.5}{1.12}, \frac{8.0 - 6.5}{1.12} \right]
]
[
\approx [-1.34, -0.45, 0.45, 1.34]
]
第三个 token:([9.0, 10.0, 11.0, 12.0])
[
\mu = 10.5, \quad \sigma = 1.12
]
[
\hat{x} \approx [-1.34, -0.45, 0.45, 1.34]
]
最终归一化结果
[
\hat{X} =
\begin{bmatrix}
\begin{bmatrix} -1.34 & -0.45 & 0.45 & 1.34 \end{bmatrix} \
\begin{bmatrix} -1.34 & -0.45 & 0.45 & 1.34 \end{bmatrix} \
\begin{bmatrix} -1.34 & -0.45 & 0.45 & 1.34 \end{bmatrix}
\end{bmatrix}
]
乘以缩放参数 (\gamma) 并加上偏移参数 (\beta)
[
y = \hat{x} \cdot \gamma + \beta
]
其中,(\gamma) 和 (\beta) 是可学习参数(形状为 (Dim,)
),它们帮助恢复特征表达能力。
如果 (\gamma = [1, 1, 1, 1]) 且 (\beta = [0, 0, 0, 0]),则最终输出与 (\hat{x}) 相同。
总的来说,层归一化不仅提高了模型的稳定性,也让模型在处理时序数据时具有更好的表现,特别是在自然语言处理和序列生成任务中。
层归一化(Layer Normalization, LN)是一种用于深度神经网络的归一化方法,通常用于 自然语言处理(NLP) 和 自注意力网络(Transformer) 中。与批归一化(Batch Normalization, BN)不同,LN 主要 针对单个样本的所有特征维度 进行归一化,而不是在 batch 维度上计算均值和标准差。
对于输入 ( X \in \mathbb{R}^{\text{Batch_size} \times \text{Seq_len} \times \text{Dim}} ),层归一化的计算过程如下:
对 每个 token 的所有特征维度 计算均值:
[
\mu = \frac{1}{\text{Dim}} \sum_{i=1}^{\text{Dim}} x_i
]
[
\sigma = \sqrt{\frac{1}{\text{Dim}} \sum_{i=1}^{\text{Dim}} (x_i - \mu)^2 + \epsilon}
]
其中,(\epsilon) 是一个很小的数,用于防止分母为零。
[
\hat{x} = \frac{x - \mu}{\sigma}
]
为了恢复模型的表达能力,LN 引入了可学习参数 (\gamma) 和 (\beta)(形状均为 (Dim,)
):
[
y = \hat{x} \cdot \gamma + \beta
]
假设输入数据形状为:
[
X \in \mathbb{R}^{\text{Batch_size} \times \text{Seq_len} \times \text{Dim}}
]
层归一化会 针对每个 token 的 Dim
维度进行归一化,即计算每个 token 内部的均值和标准差,而 不考虑 batch 维度或序列长度 Seq_len
。
归一化方法 | 归一化维度 | 计算均值/方差的范围 | 适用场景 |
---|---|---|---|
批归一化(BN) | 纵向(Batch 维度) | 计算相同特征维度在整个 batch 维度上的均值和标准差 | CNN,计算机视觉 |
层归一化(LN) | 横向(特征维度) | 计算每个 token 的所有特征维度的均值和标准差 | NLP,Transformer |
假设:
[
X =
\begin{bmatrix}
\begin{bmatrix} 1.0 & 2.0 & 3.0 & 4.0 \end{bmatrix} \
\begin{bmatrix} 5.0 & 6.0 & 7.0 & 8.0 \end{bmatrix} \
\begin{bmatrix} 9.0 & 10.0 & 11.0 & 12.0 \end{bmatrix}
\end{bmatrix}
]
对于第一行 ([1.0, 2.0, 3.0, 4.0]):
[
\mu = 2.5, \quad \sigma = \sqrt{1.25} \approx 1.12
]
归一化:
[
\hat{x} \approx [-1.34, -0.45, 0.45, 1.34]
]
最终:
[
y = \hat{x} \cdot \gamma + \beta
]
Inception Score(简称IS)是衡量生成模型(例如GAN)生成图像质量的一个重要指标。其核心思想是衡量生成图像的“清晰度”和“多样性”。
具体地,IS是通过以下步骤计算的:
Inception Score的计算公式为:
[
IS = \exp\left(\mathbb{E}x[D{KL}(p(y|x) || p(y))]\right)
]
其中,(p(y|x)) 是给定生成图像 (x) 后的类别概率分布,(p(y)) 是所有生成图像类别的均匀分布。
Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.
1 | $ hexo new "My New Post" |
More info: Writing
1 | $ hexo server |
More info: Server
1 | $ hexo generate |
More info: Generating
1 | $ hexo deploy |
More info: Deployment
从单模型到 “左右互搏术” 的对抗式模型,GAN 的对抗式的思路注定了它的革命性意义
在 GAN 的横空出世之前,生成模型的研究主要依赖于传统的概率图模型和最大似然估计等方法。生成模型的基本目标是通过学习训练数据的分布,来生成类似于训练数据的新样本。
但在当时,主流的生成模型往往依赖于一种显式建模的方式,通常使用自回归模型(如HMM、VAE等),通过明确的概率分布和参数估计进行训练。虽然这些方法可以实现某些生成任务,但始终存在一些局限性:
在这些挑战面前,生成模型的研究面临瓶颈,直到GAN的问世,一场生成模型的革命才悄然拉开帷幕。
深谙“左右互搏术”,G_model 与 D_model 既是对手,亦是良友
GAN 的核心思想是 “对抗”,生成器和判别器在对抗式的博弈中 相互优化。
生成器的目标是产生尽可能逼真的假样本,尽量“骗过”判别器;而判别器的目标是区分生成样本和真实样本。两者通过不断“斗智斗勇”的过程,最终达到一种平衡:生成器能够生成与真实样本几乎无差别的图像,而判别器无法轻易分辨。
这一创新的思路彻底改变了生成模型的训练方式,从参数化的显式建模转向了隐式的对抗博弈。这种“左右互搏”的博弈式优化,不仅在图像生成、视频生成等领域取得了突破性进展,也为其他机器学习任务提供了新的启示。
GAN的优点:
但尽管GAN如此强大,其训练过程中却充满了挑战,这也为后续的研究带来了许多值得思考的问题。
尽管GAN具有强大的生成能力,但其训练和调优相对复杂,存在以下挑战:
模式崩溃(Mode Collapse)
为了成功逃避判别器的严厉审查,生成器将为了成功而成功
趋利避害,本能也
这就是 模式崩溃
模型崩溃是指机器学习模型由于在另一个模型(包括其自身的先前版本)的输出上进行未经整理的训练而产生错误,从而逐渐退化的一种现象。
Shumailov 等人 创造了这个术语,并描述了退化的两个具体阶段:早期模型崩溃和晚期模型崩溃。在早期模型崩溃阶段,模型开始丢失分布尾部的信息–主要影响少数数据。后来的研究强调,早期模型崩溃很难察觉,因为整体性能可能看起来有所改善,而模型在少数数据上的性能却有所下降。
——来自维基百科
也就是说,生成器可能只能生成有限种类的数据,而忽略了数据集中的其他多样性。
为了解决这一问题,后续研究者提出了许多改进方法,如使用批量正则化或采用多生成器架构。
训练不稳定:
为了与判别器斗智斗勇,生成器不得不全力以赴,但判别器的挑剔和苛刻,使得整个训练过程充满了矛盾与张力。
这正是生成器和判别器之间的关系。生成器希望产生尽可能接近真实数据的假样本,而判别器则不断提高自己的标准,试图识别这些假样本。两者的竞争如果没有良好的平衡,可能会导致训练过程的不稳定。训练可能会早期收敛,但结果却远非理想,生成器并没有学到足够的生成策略,或者根本没有学到如何应对判别器的挑战。
训练不稳定是GAN训练中的一个普遍问题。为了避免生成器和判别器之间的学习速率失衡,研究者提出了WGAN(Wasserstein GAN),它通过引入 “Wasserstein距离” 来缓解这种不稳定性,使得优化过程更加平滑且容易收敛。此外,合理的超参数调整,尤其是学习率和优化器选择,也能在一定程度上改善这一问题,但是这往往是漫长的尝试。
难以评估:
生成器的目标是创造看似真实的样本,而判别器的职责是让生成的样本无法再隐藏在真实数据的“伪装”下。但这场较量最终的标准究竟是什么?
在GAN中,评估生成模型的质量也是一个复杂的问题。生成器的目标是生成看起来非常真实的数据,而判别器则试图分辨出这些“假冒伪劣”的样本。因此,传统的损失函数难以准确地评估生成器的表现,因为损失函数可能无法捕捉到生成数据与真实数据之间微妙的差别。想象你在画布上做出的每一笔都应该尽可能与真实世界的数据匹配,如何保证每一笔都完美无瑕?
为了解决这个问题,研究者们提出了一些新的评估方法,如 Fréchet Inception Distance(FID),它通过比较生成样本和真实样本在 Inception 模型特征空间中的分布差异来量化生成数据的质量。这种方法能够 更加客观 地衡量生成样本与真实数据之间的距离,避免仅依赖人工评估的主观性。
除此之外,还有诸如 Inception Score 等评估方法,试图用更精细的方式来捕捉生成样本的质量。
GAN 通过引入生成器与判别器的 对抗式博弈,极大推动了生成模型的进步,使得机器能够生成几乎与真实数据无异的样本。然而,这种创新的思路也带来了新的挑战:模式崩溃、训练不稳定、评估困难等问题,成为GAN进一步发展的瓶颈。
但正是这些挑战推动了GAN及其变种模型(如WGAN、WGAN-GP等)的不断演进,解决方案也在逐步落地。
从 Wasserstein距离 到 Fréchet Inception Distance,从 批量正则化 到 多生成器架构,我们已经看到研究者们为克服这些问题所做出的巨大努力。
随着这些挑战的逐步解决,GAN无疑将在未来的机器学习领域中继续发挥其巨大的潜力。
创新的 GAN + 卓越的 CNN = 创新卓越的DCGAN
从简单的全连接神经网络架构走向了更复杂的深度卷积网络架构
DCGAN通过深度卷积网络增强了生成器与判别器的能力,尤其是生成器的表现得到了极大改进。相比于传统GAN,DCGAN用卷积层替代了全连接层,这一改动使得生成器能够有效捕捉到图像的空间结构和细节特征。
DCGAN的一个关键创新就是使用 去卷积(Deconvolution)操作,让生成器能够从潜在空间映射到高维数据空间。
效果:
我不仅让你生成,我还得让你知道你生成的是什么
ACGAN的提出,是为了让生成器的输出不再局限于仅生成真实感的图像,而是能够在生成图像的同时,控制图像的类别或标签。这一创新解决了传统GAN在生成任务中 缺乏可控性的问题。
ACGAN 在原始 GAN 的基础上,引入了一个 辅助分类器,生成器不仅根据随机噪声生成图像,同时也根据附加的类别标签生成特定类型的图像。
判别器则变得更加复杂,它不仅需要判断样本的真实性,还需要预测样本的类别。这种设计使得 ACGAN 能够在生成的过程中引入条件信息,从而控制生成图像的标签。
效果:
你这数学原理有bug !
WGAN 的提出,打破了传统GAN在训练过程中经常出现的 梯度消失与训练不稳定问题。
WGAN的核心创新在于引入了 Wasserstein距离,代替了传统GAN中使用的 JS散度。Wasserstein距离具有更好的数学性质,能够提供更稳定的训练信号,特别是在生成分布与真实分布差异较大时,它能够避免出现梯度消失的情况。同时,WGAN的判别器不再是二分类器,而是一个判别评分器,用于衡量样本的真实性。
为了优化训练过程,WGAN采用了 权重剪切技术,将判别器的权重限制在一定范围内,避免了权重过大导致的训练不稳定。
效果:
粗暴的裁剪是比不上优雅的梯度惩罚的
WGAN-GP 是对WGAN的一种优化,它引入了梯度惩罚(Gradient Penalty)机制,取代了WGAN中的权重剪切。梯度惩罚的加入进一步提升了模型的稳定性,并解决了WGAN中权重剪切可能带来的副作用。
WGAN-GP通过对判别器的梯度进行惩罚,确保其梯度的平滑性。与WGAN中的权重剪切不同,梯度惩罚使得优化过程更加细致,能够避免生成器和判别器之间的不平衡。其损失函数中加入了梯度惩罚项:
[
L = D(x) - D(G(z)) + \lambda \cdot \mathbb{E}[\left( |\nabla_{\hat{x}} D(\hat{x})|_2 - 1 \right)^2]
]
其中,(\hat{x}) 是生成器输出的线性插值样本,(\lambda) 为梯度惩罚的权重。
效果:
循环交叉,交叉循环
CycleGAN 作为一种无监督学习的生成对抗网络,特别适用于图像到图像的转换任务,而无需成对的数据。CycleGAN通过引入循环一致性损失,使得模型能够在没有标签数据的情况下,实现不同领域之间的图像转换。
CycleGAN使用两个生成器和两个判别器。生成器一负责将源域图像转换为目标域图像,另一个生成器则将目标域图像转换回源域图像。关键在于循环一致性损失,通过确保转换回来的图像能够尽可能还原原图,保证生成图像的质量和一致性。
其目标是:
效果:
FID 是一个更为复杂且更为精细的评估生成图像质量的指标。它的灵感来源于计算生成数据和真实数据在特征空间的距离。相较于Inception Score,FID更关注生成样本和真实样本之间的统计差异。
Fréchet距离本质上衡量的是两组数据的高斯分布之间的差异。FID越小,表示生成样本和真实数据越相似。
假设我们从生成图像和真实图像中分别得到特征均值和协方差:
那么,FID的计算公式为:
[
FID = \left| \mu_g - \mu_r \right|^2 + \text{Tr}\left( \Sigma_g + \Sigma_r - 2 \left( \Sigma_g \Sigma_r \right)^{1/2} \right)
]
其中,( \mu_g ) 和 ( \mu_r ) 是生成图像和真实图像的特征均值,( \Sigma_g ) 和 ( \Sigma_r ) 是它们的协方差矩阵。