跳转至

深度学习

为什么注意力机制中要除以 \(\sqrt{d_k}\) :从方差到梯度的推导

\[ Attention(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V \]

在 Transformer 的注意力机制中,计算点积注意力 \(QK^T\) 之后,需要除以一个 \(\sqrt{d_k}\) 进行缩放。这一操作通常被解释为“为了数值稳定性”。这里的“稳定”究竟指的是什么?如果不除以 \(\sqrt{d_k}\) 就不稳定了么?为什么不除以 \(d_k\) 或其他数值呢?

本文分析了点积的方差如何随维度增长而增大,并进一步推导 \(\text{softmax}\) 变换得到的行向量的雅可比矩阵,展示当输入数值过大时梯度如何逐渐趋近于零。通过这一过程,我们将会理解,除以 \(\sqrt{d_k}\) 并不是随意的设置,而是确保注意力机制在高维空间中仍能保持可训练性的必要条件。

ConcatDataset 和 StackDataset

在 PyTorch 中,ConcatDatasetStackDataset 是两种不同的数据集组合方式。本文介绍了它们的作用及其适用场景。

Python
# 使用 ConcatDataset 连接数据集
concat_dataset = ConcatDataset([dataset1, dataset2])
# 遍历 ConcatDataset
for sample in concat_dataset:
    print(sample)
Text Only
1
2
3
4
5
6
Python
# 使用 StackDataset 组合数据集
stack_dataset = StackDataset(dataset1, dataset2)

# 遍历 StackDataset
for sample in stack_dataset:
    print(sample)
Text Only
(1, 4)
(2, 5)
(3, 6)

理解 PyTorch 中的 CrossEntropyLoss

在机器学习中,特别是处理分类问题时,损失函数是衡量模型预测与实际标签差异的关键。在 PyTorch 中,CrossEntropyLoss是一个常用的损失函数,用于分类问题。它首先通过 Softmax 函数计算对应类别的概率值,然后计算每个样本的负对数似然损失,最后对所有样本的损失值求平均。

本文将通过一个简单的例子来手动计算CrossEntropyLoss,并展示如何使用 PyTorch 实现这一过程。

基于深度学习的中文文本错误识别与纠正模型总结

中文写作是许多人工作和生活的重要内容之一,在写作中使用准确的用词和清晰的句法,能够帮助文本的阅读者快速且正确地理解作者所表达的意思。如果一段中文文本存在大量错字(例如由于书写错误导致出现不存在的汉字)、别字(每个汉字都存在,但由于字音、字形相似但意义不同而混淆了搭配)和语法错误,这将使读者感到十分困惑,影响阅读体验。

在错别字层面,现代数字化的文本大多由用户通过输入法进行编辑,输入法内置词典的正确性使得文本不易形成错字,但由于输入时选中文字的疏忽、对词语搭配具有错误的认知等原因,别字的问题依然经常出现。在正式的书面写作中,使用未经组织的、口语化的文本也经常导致语法错误的出现。在语法层面,由于用户在文本输入法,语音输入法使用上的随意性,后续又缺少审核,极易产生语法错误内容。近年来随着自媒体的热潮,人人都是信息的生产者,互联网上语法错误的内容暴增,但语法不通顺的文本极大影响了用户体验。

为实现中文文本纠错、提高汉语使用的正确性,同时减少人工校验的成本,本文初步探讨了基于深度学习的中文文本错误识别与纠正模型,包括它的核心目标、从输入数据到输出数据的流程、训练模型需要用到的数据来源、使用的前沿模型以及现有论文的测试效果等。

深入理解 GRU 及其 PyTorch 实现

本文介绍了 GRU 的网络结构,梳理了 GRU 的前向传播关系,即 \(t-1\) 时间步的隐状态 \(h_{t-1}\)\(t\) 时间步的输入 \(x_t\)、更新门 \(z_t\)、重置门 \(r_t\)\(t\) 时间步的隐状态输出 \(h_t\) 之间是如何转换的。为了更好地理解 GRU,本文给出了各个张量的维数大小关系的数值示例。最后,本文提供了使用 PyTorch 实现一个 2 层 GRU 模型的代码。

Gated Recurrent Unit