优化算法进阶

11.6 Momentum
在 Section 11.4 中,我们提到,目标函数有关自变量的梯度代表了目标函数在自变量当前位置下降最快的方向。因此,梯度下降也叫作最陡下降(steepest descent)。在每次迭代中,梯度下降根据自变量当前位置,沿着当前位置的梯度更新自变量。然而,如果自变量的迭代方向仅仅取决于自变量当前位置,这可能会带来一些问题。对于noisy gradient,我们需要谨慎的选取学习率和batch size, 来控制梯度方差和收敛的结果。

gt=∂w1|Bt|∑i∈Btf(xi,wt−1)=1|Bt|∑i∈Btgi,t−1.

An ill-conditioned Problem
Condition Number of Hessian Matrix:

condH=λmaxλmin

where λmax,λmin is the maximum amd minimum eignvalue of Hessian matrix.

让我们考虑一个输入和输出分别为二维向量 x=[x1,x2]⊤ 和标量的目标函数:

f(x)=0.1x21+2x22

condH=40.2=20→ill-conditioned

Maximum Learning Rate
For f(x) , according to convex optimizaiton conclusions, we need step size η .
To guarantee the convergence, we need to have η .
Supp: Preconditioning
在二阶优化中,我们使用Hessian matrix的逆矩阵(或者pseudo inverse)来左乘梯度向量 i.e.Δx=H−1g ,这样的做法称为precondition,相当于将 H 映射为一个单位矩阵,拥有分布均匀的Spectrum,也即我们去优化的等价标函数的Hessian matrix为良好的identity matrix。

与Section 11.4一节中不同,这里将 x21 系数从 1 减小到了 0.1 。下面实现基于这个目标函数的梯度下降,并演示使用学习率为 0.4 时自变量的迭代轨迹。

%matplotlib inline
import sys
sys.path.append("/home/kesci/input")
import d2lzh1981 as d2l
import torch

eta = 0.4

def f_2d(x1, x2):
return 0.1 * x1 ** 2 + 2 * x2 ** 2

def gd_2d(x1, x2, s1, s2):
return (x1 - eta * 0.2 * x1, x2 - eta * 4 * x2, 0, 0)

d2l.show_trace_2d(f_2d, d2l.train_2d(gd_2d))
epoch 20, x1 -0.943467, x2 -0.000073

可以看到,同一位置上,目标函数在竖直方向( x2 轴方向)比在水平方向( x1 轴方向)的斜率的绝对值更大。因此,给定学习率,梯度下降迭代自变量时会使自变量在竖直方向比在水平方向移动幅度更大。那么,我们需要一个较小的学习率从而避免自变量在竖直方向上越过目标函数最优解。然而,这会造成自变量在水平方向上朝最优解移动变慢。

下面我们试着将学习率调得稍大一点,此时自变量在竖直方向不断越过最优解并逐渐发散。

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

词嵌入基础
我们在“循环神经网络的从零开始实现”一节中使用 one-hot 向量表示单词,虽然它们构造起来很容易,但通常并不是一个好选择。一个主要的原因是,one-hot 词向量无法准确表达不同词之间的相似度,如我们常常使用的余弦相似度。

Word2Vec 词嵌入工具的提出正是为了解决上面这个问题,它将每个词表示成一个定长的向量,并通过在语料库上的预训练使得这些向量能较好地表达不同词之间的相似和类比关系,以引入一定的语义信息。基于两种概率模型的假设,我们可以定义两种 Word2Vec 模型:

Skip-Gram 跳字模型:假设背景词由中心词生成,即建模 P(wo∣wc) ,其中 wc 为中心词, wo 为任一背景词;

词嵌入进阶

词嵌入进阶
在“Word2Vec的实现”一节中,我们在小规模数据集上训练了一个 Word2Vec 词嵌入模型,并通过词向量的余弦相似度搜索近义词。虽然 Word2Vec 已经能够成功地将离散的单词转换为连续的词向量,并能一定程度上地保存词与词之间的近似关系,但 Word2Vec 模型仍不是完美的,它还可以被进一步地改进:

子词嵌入(subword embedding):FastText 以固定大小的 n-gram 形式将单词更细致地表示为了子词的集合,而 BPE (byte pair encoding) 算法则能根据语料库的统计信息,自动且动态地生成高频子词的集合;
GloVe 全局向量的词嵌入: 通过等价转换 Word2Vec 模型的条件概率公式,我们可以得到一个全局的损失函数表达,并在此基础上进一步优化模型。
实际中,我们常常在大规模的语料上训练这些词嵌入模型,并将预训练得到的词向量应用到下游的自然语言处理任务中。本节就将以 GloVe 模型为例,演示如何用预训练好的词向量来求近义词和类比词。

GloVe 全局向量的词嵌入
GloVe 模型
先简单回顾以下 Word2Vec 的损失函数(以 Skip-Gram 模型为例,不考虑负采样近似):


T

t=1 ∑−m≤j≤m,j≠0 logP(w(t+j)∣w(t))
其中

P(wj∣wi)=
exp(u

j
vi)
∑k∈Vexp(u

k
vi)

是 wi 为中心词,wj 为背景词时 Skip-Gram 模型所假设的条件概率计算公式,我们将其简写为 qij。

注意到此时我们的损失函数中包含两个求和符号,它们分别枚举了语料库中的每个中心词和其对应的每个背景词。实际上我们还可以采用另一种计数方式,那就是直接枚举每个词分别作为中心词和背景词的情况:

− ∑i∈V ∑j∈V xijlogqij
其中 xij 表示整个数据集中 wj 作为 wi 的背景词的次数总和。

我们还可以将该式进一步地改写为交叉熵 (cross-entropy) 的形式如下:

− ∑i∈V xi ∑j∈V pijlogqij
其中 xi 是 wi 的背景词窗大小总和,pij=xij/xi 是 wj 在 wi 的背景词窗中所占的比例。

从这里可以看出,我们的词嵌入方法实际上就是想让模型学出 wj 有多大概率是 wi 的背景词,而真实的标签则是语料库上的统计数据。同时,语料库中的每个词根据 xi 的不同,在损失函数中所占的比重也不同。

注意到目前为止,我们只是改写了 Skip-Gram 模型损失函数的表面形式,还没有对模型做任何实质上的改动。而在 Word2Vec 之后提出的 GloVe 模型,则是在之前的基础上做出了以下几点改动:

使用非概率分布的变量 p

ij
=xij 和 q′ij=exp(u

j
vi),并对它们取对数;
为每个词 wi 增加两个标量模型参数:中心词偏差项 bi 和背景词偏差项 ci,松弛了概率定义中的规范性;
将每个损失项的权重 xi 替换成函数 h(xij),权重函数 h(x) 是值域在 [0,1] 上的单调递增函数,松弛了中心词重要性与 xi 线性相关的隐含假设;
用平方损失函数替代了交叉熵损失函数。
综上,我们获得了 GloVe 模型的损失函数表达式:

∑i∈V ∑j∈V h(xij)(u

j
vi+bi+cj−logxij)2
由于这些非零 xij 是预先基于整个数据集计算得到的,包含了数据集的全局统计信息,因此 GloVe 模型的命名取“全局向量”(Global Vectors)之意。

载入预训练的 GloVe 向量
GloVe 官方 提供了多种规格的预训练词向量,语料库分别采用了维基百科、CommonCrawl和推特等,语料库中词语总数也涵盖了从60亿到8,400亿的不同规模,同时还提供了多种词向量维度供下游模型使用。

torchtext.vocab 中已经支持了 GloVe, FastText, CharNGram 等常用的预训练词向量,我们可以通过声明 torchtext.vocab.GloVe 类的实例来加载预训练好的 GloVe 词向量。

pytorch组队学习相关推荐

  1. 【组队学习】【35期】深入浅出Pytorch

    深入浅出Pytorch 航路开辟者:李嘉骐.牛志康.刘洋.陈安东 领航员:朱松青 航海士:管柯琴.宋泽山.林旭升 基本信息 开源内容:https://github.com/datawhalechina ...

  2. 【Datawhale组队学习Pytorch】Task 完结篇

    [项目简介] PyTorch是利用深度学习进行数据科学研究的重要工具,在灵活性.可读性和性能上都具备相当的优势,近年来已成为学术界实现深度学习算法最常用的框架.考虑到PyTorch的学习兼具理论储备和 ...

  3. 【Datawhale 组队学习Pytorch】Task01 Pytorch安装和基础知识

    [项目简介] PyTorch是利用深度学习进行数据科学研究的重要工具,在灵活性.可读性和性能上都具备相当的优势,近年来已成为学术界实现深度学习算法最常用的框架.考虑到PyTorch的学习兼具理论储备和 ...

  4. 【新周报(051)】Datawhale组队学习

    记录: 按照本周规划,我们正在与阿里云天池合作开展"在线编程训练营"的组队学习活动,在这次活动中我们已经完成12个知识点(数组.链表.栈.字符串.树.位运算.双指针.搜索.排序.动 ...

  5. 【组队学习】十二月微信图文索引

    十二月微信图文索引 一.组队学习相关 周报: Datawhale组队学习周报(第042周) Datawhale组队学习周报(第043周) Datawhale组队学习周报(第044周) Datawhal ...

  6. 【组队学习】十一月微信图文索引

    十一月微信图文索引 一.组队学习相关 周报: Datawhale组队学习周报(第037周) Datawhale组队学习周报(第038周) Datawhale组队学习周报(第039周) Datawhal ...

  7. Datawhale组队学习周报(第038周)

    本周报总结了从 11月01日至11月07日,Datawhale组队学习的运行情况,我们一直秉承"与学习者一起成长的理念",希望这个活动能够让更多的学习者受益. 第 30 期组队学习 ...

  8. LSGO软件技术团队招新 线下组队学习

    团队招新 LSGO软件技术团队(Dreamtech算法组)成立于2010年09月,团队主要从事地理信息系统.管理信息系统.计算机视觉等领域的应用开发,团队同时具有培养学生的重要职能,毕业学生分布在IB ...

  9. 【组队学习】10月份微信图文索引

    10月份微信图文索引 一.组队学习相关 周报: Datawhale组队学习周报(第036周) Datawhale组队学习周报(第035周) Datawhale组队学习周报(第034周) Datawha ...

最新文章

  1. SCOM2012部署系列之七:推送Windows监控代理
  2. UA MATH567 高维统计IV Lipschitz组合4 对称群上的均匀分布
  3. angular @ViewChild使用
  4. 安装完成Fedora 15 LXDE 定制版后的操作
  5. Docker Compose 项目
  6. 推荐周立功先生的一本书
  7. .NET 程序员十种常用辅助开发工具
  8. Java成神之路——String长度限制
  9. 我的世界服务器不显示浮空字,我的世界服务器浮空字怎么做 | 手游网游页游攻略大全...
  10. Nginx内置变量及正则语法
  11. 【排序算法】冒泡排序的三种方法
  12. 向日葵服务器维护,向日葵远程服务器
  13. Cesium 多边形(polygon)extrudedHeight 和 height 的区别
  14. 如何快速调出软键盘_软键盘怎么调出来 打开软键盘的方法【图文】
  15. 手机应用(App)推广服务-App收录,App推广,App评测,App下载,App搜索-搜应用网(www.souapp.com)
  16. 面试了一位 46 岁的程序员,思绪万千,最后结局竟让我大惊失色!
  17. maven 出现:Failed to execute goal on project...Could not resolve dependencies for project
  18. 基于STM32的高精度温度测控系统-原理图设计
  19. 看EyeEm如何在产品开发中整合、运用深度学习模型
  20. linux单进程最大内存,限制单个Linux进程的内存使用量

热门文章

  1. 艰难的抉择,阿里“小前台、大中台”的解读
  2. 测试人员如何区分前端和后台BUG方法流程
  3. 招聘网站代码模板 mysql_招聘网站爬虫模板
  4. 有哪些手机赚钱的副业?
  5. 认证的公众号可以快速免费注册认证小程序
  6. [蓝桥杯]Excel题
  7. 09-Httprunner-生成测试报告
  8. C#使用wkhtmltopdf将网页存为pdf或图片
  9. 抖音橱窗等级被降低了是什么原因造成的?怎么办?
  10. WIN10版本安装JDK