Unigram中的损失
Unigram 算法在计算损失时,其核心思想是衡量在当前词汇表和概率模型下,对训练语料进行分词的“不确定性”或“不完美程度”。这个“损失”并非传统深度学习中的梯度下降损失,而是一种用于评估和优化分词模型的指标。
具体来说,Unigram 算法通过以下方式计算和利用“损失”:
1. 核心概念:分词的似然 (Likelihood)
Unigram 模型假设一个句子被分词成若干个子词(或词)的概率是这些子词概率的乘积。给定一个句子 S 被分词为 [w1, w2, ..., wn]
,其似然 (Likelihood) 为:
P(S) = P(w1) * P(w2) * ... * P(wn)
这里的 P(wi)
是子词 wi
在当前词汇表中的出现概率。
2. 损失函数:负对数似然 (Negative Log-Likelihood, NLL)
为了计算方便(避免数值下溢,并将乘法转换为加法),通常使用负对数似然 (NLL) 作为损失函数:
Loss = -log(P(S)) = -log(P(w1)) - log(P(w2)) - ... - log(P(wn))
这个损失值越小,说明当前的分词方案和概率模型对训练语料的拟合程度越高。
3. 损失的计算过程
在 Unigram 算法的迭代优化过程中,损失的计算和使用体现在以下几个步骤:
初始化词汇表:
- 从字符级别或一个较大的初始词汇表开始。
- 为每个子词分配一个初始概率(通常基于频率)。
Viterbi 分词 (计算最优路径):
- 对于训练语料中的每一个句子,使用 Viterbi 算法(一种动态规划算法)来找到概率最高(即损失最小)的分词路径。
- 这个过程会考虑所有可能的子词组合,并选择使得
P(w1)*P(w2)*...*P(wn)
最大的那一条路径。 - 这条路径上的每个子词都被视为在当前模型下对该句子的“最优”分词。
计算总体损失:
- 对训练语料中所有句子,都进行 Viterbi 分词,得到各自的最优分词路径。
- 将所有句子的负对数似然相加,得到整个训练集的总损失:
Total Loss = Σ(-log(P(Sentence_i)))
- 这个总损失衡量了当前词汇表和概率模型对整个语料库的拟合程度。
迭代优化 (降低损失):
- Unigram 算法的核心是迭代地缩减词汇表。它会尝试从当前词汇表中移除一些“不重要”的子词。
- 如何判断“不重要”?就是看移除某个子词后,对总体损失的影响。
- 算法会计算移除每个候选子词后,重新进行 Viterbi 分词并计算新的总损失。
- 选择那个导致总损失增加最少(或者说,对模型性能损害最小)的子词进行移除。
- 移除后,重新计算剩余子词的概率(通常是基于它们在新分词结果下的频率),然后进入下一轮迭代。
总结
简单来说,Unigram 算法的“损失”就是训练语料在当前分词模型下的负对数似然总和。
- 目标:找到一个大小合适的词汇表,使得这个损失最小。
- 方法:通过反复的“Viterbi分词 -> 计算损失 -> 移除对损失影响最小的子词 -> 更新概率”这一循环,逐步优化词汇表。
- 关键点:损失的计算依赖于 Viterbi 算法找到的“最优”分词路径,而这个路径又依赖于当前的子词概率。这是一个相互依赖、迭代优化的过程。
因此,Unigram 算法的损失计算是其能够自动学习并构建高效、紧凑词汇表的关键机制。