优化算法进阶
ill-conditioned problem
Condition Number of Hessian Matrix:
cond_{H} = \frac{\lambda_{max}}{\lambda_{min}}
举例:
f(\boldsymbol{x})=0.1x_12+2x_22
cond_{H} = \frac{4}{0.2} = 20 \quad \rightarrow \quad \text{ill-conditioned}
Supp: Preconditioning
在二阶优化中,我们使用Hessian matrix的逆矩阵(或者pseudo inverse)来左乘梯度向量 i.e. \Delta_{x} = H^{-1}\mathbf{g} ,这样的做法称为precondition,相当于将 H 映射为一个单位矩阵,拥有分布均匀的Spectrum,也即我们去优化的等价标函数的Hessian matrix为良好的identity matrix。
Solution to ill-condition
Preconditioning gradient vector: applied in Adam, RMSProp, AdaGrad, Adelta, KFC, Natural gradient and other secord-order optimization algorithms.
Averaging history gradient: like momentum, which allows larger learning rates to accelerate convergence; applied in Adam, RMSProp, SGD momentum.
word2vec
onehot的缺陷与word2vec的改进
使用 one-hot 向量表示单词,虽然它们构造起来很容易,但通常并不是一个好选择。一个主要的原因是,one-hot 词向量无法准确表达不同词之间的相似度,如我们常常使用的余弦相似度。
Word2Vec 词嵌入工具的提出正是为了解决上面这个问题,它将每个词表示成一个定长的向量,并通过在语料库上的预训练使得这些向量能较好地表达不同词之间的相似和类比关系,以引入一定的语义信息。
word2vec
感觉教程更偏向代码,我这里搜集了讲原理比较好的博客:
词嵌入进阶
子词嵌入
子词嵌入(subword embedding):FastText 以固定大小的 n-gram 形式将单词更细致地表示为了子词的集合,而 BPE (byte pair encoding) 算法则能根据语料库的统计信息,自动且动态地生成高频子词的集合;
GloVe全局向量的词嵌入
GloVe 全局向量的词嵌入: 通过等价转换 Word2Vec 模型的条件概率公式,我们可以得到一个全局的损失函数表达,并在此基础上进一步优化模型。
而在 Word2Vec 之后提出的 GloVe 模型,则是在之前的基础上做出了以下几点改动:
- 使用非概率分布的变量 p'{ij}=x{ij} 和 q′_{ij}=\exp(\boldsymbol{u}^\top_j\boldsymbol{v}_i) ,并对它们取对数;
- 为每个词 w_i 增加两个标量模型参数:中心词偏差项 b_i 和背景词偏差项 c_i ,松弛了概率定义中的规范性;
- 将每个损失项的权重 x_i 替换成函数 h(x_ij) ,权重函数 h(x) 是值域在 [0,1] 上的单调递增函数,松弛了中心词重要性与 x_i 线性相关的隐含假设;
- 用平方损失函数替代了交叉熵损失函数。
GloVe模型的损失函数公式:
\sum_{i\in\mathcal{V}}\sum_{j\in\mathcal{V}} h(x_{ij}) (\boldsymbol{u}^\top_j\boldsymbol{v}i+b_i+c_j-\log x{ij})^2
torchtext.vocab 中已经支持了 GloVe, FastText, CharNGram 等常用的预训练词向量,我们可以通过声明 torchtext.vocab.GloVe 类的实例来加载预训练好的 GloVe 词向量。
利用GlovVe的语料库
求近义词:由于词向量空间中的余弦相似性可以衡量词语含义的相似性,我们可以通过寻找空间中的 k 近邻,来查询单词的近义词。
求类比词:求类比词的思路是,搜索与 \text{vec}(c)+\text{vec}(b)−\text{vec}(a) 的结果向量最相似的词向量,其中 vec(w) 为 w 的词向量。