技术标签: # 深度学习与自然语言处理教程 ◉斯坦福CS224n最全笔记 深度学习 transformer 自然语言处理
ShowMeAI为斯坦福CS224n《自然语言处理与深度学习(Natural Language Processing with Deep Learning)》课程的全部课件,做了中文翻译和注释,并制作成了GIF动图!视频和课件等资料的获取方式见文末。
简单且常见的解决方案:
训练时:词汇表 { words occurring, say, ≥ 5 times } ∪ { < UNK > } \{\text { words occurring, say, } \geq 5 \text { times }\} \cup\{<\text{UNK}>\} { words occurring, say, ≥5 times }∪{ <UNK>}
运行时:使用 < UNK > <\text{UNK}> <UNK> 代替词汇表之外的词 OOV
问题:
解决方案
如果测试时的 < UNK > <\text{UNK}> <UNK> 单词不在你的词汇表中,但是出现在你使用的无监督词嵌入中,测试时直接使用这个向量
此外,你可以将其视为新的单词,并为其分配一个随机向量,将它们添加到你的词汇表
帮助很大或者也许能帮点忙
你可以试试另一件事
存在两个大问题
步骤3:在序列标记模型中同时使用单词嵌入和 LM 嵌入
步骤2:为输入序列中的每个标记准备单词嵌入和 LM 嵌入
步骤1:预训练词嵌入和语言模型
与上文无关的单词嵌入 + RNN model 得到的 hidden states 作为特征输入
h k , l = [ h → k , 1 ; h ← k , 1 ; h k L M ] \mathbf{h}_{k, l}=\left[\overrightarrow{\mathbf{h}}_{k, 1} ; \overleftarrow{\mathbf{h}}_{k, 1} ; \mathbf{h}_{k}^{L M}\right] hk,l=[hk,1;hk,1;hkLM]
Billion word benchmark
的8亿个训练单词上训练语言模型观察结果
任务特定的BiLSTM观察结果
https://arxiv.org/pdf/1708.00107.pdf
也有一种思路:使用训练好的序列模型,为其他NLP模型提供上下文
思路:机器翻译是为了保存意思,所以这也许是个好目标?
使用 seq2seq + attention NMT system 中的 Encoder,即 2 层 bi-LSTM,作为上下文提供者
所得到的 CoVe 向量在各种任务上都优于 GloVe 向量
但是,结果并不像其他幻灯片中描述的更简单的 NLM 训练那么好,所以似乎被放弃了
训练一个双向语言模型 (LM)
目标是效果 OK 但不要太大的语言模型 (LM)
R k = { x k L M , h → k , j L M , h ← k , j L M ∣ j = 1 , … , L } = { h k , j L M ∣ j = 0 , … , L } \begin{aligned} R_{k} &=\left\{\mathbf{x}_{k}^{L M}, \overrightarrow{\mathbf{h}}_{k, j}^{L M}, \overleftarrow{\mathbf{h}}_{k, j}^{L M} \mid j=1, \ldots, L\right\} \\ &=\left\{\mathbf{h}_{k, j}^{L M} \mid j=0, \ldots, L\right\} \end{aligned} Rk={ xkLM,hk,jLM,hk,jLM∣j=1,…,L}={ hk,jLM∣j=0,…,L}
E L M o k t a s k = E ( R k ; Θ t a s k ) = γ t a s k ∑ j = 0 L s j t a s k h k , j L M \mathbf{E} \mathbf{L} \mathbf{M} \mathbf{o}_{k}^{t a s k}=E\left(R_{k} ; \Theta^{t a s k}\right)=\gamma^{t a s k} \sum_{j=0}^{L} s_{j}^{t a s k} \mathbf{h}_{k, j}^{L M} ELMoktask=E(Rk;Θtask)=γtaskj=0∑Lsjtaskhk,jLM
γ t a s k \gamma^{task} γtask 衡量 ELMo 对任务的总体有用性,是为特定任务学习的全局比例因子
s t a s k \mathbf{s}^{task} stask 是 softmax 归一化的混合模型权重,是 BiLSTM 的加权平均值的权重,对不同的任务是不同的,因为不同的任务对不同层的 BiLSTM 的
首先运行 biLM 获取每个单词的表示
然后,让 (无论什么) 最终任务模型使用它们
这两个 biLSTM NLM 层有不同的用途 / 含义
这似乎很有趣,但它是如何通过两层以上的网络来实现的看起来更有趣
在大型通用领域的无监督语料库上使用 biLM 训练
使用合理大小的 1 GPU
语言模型,并不是真的很大
**在LM调优中要注意很多 **
学习分类器时逐步分层解冻和STLR
使用 [ h T , maxpool ( h ) , meanpool ( h ) ] \left[h_{T}, \operatorname{maxpool}(\mathbf{h}), \operatorname{meanpool}(\mathbf{h})\right] [hT,maxpool(h),meanpool(h)] 进行分类
使用大型的预训练语言模型,是一种提高性能的非常有效的方法
补充说明
补充说明
补充说明
我们想要并行化,但是RNNs本质上是顺序的
尽管有 GRUs 和 LSTMs,RNNs 仍然需要注意机制来处理长期依赖关系——否则状态之间的 path length 路径长度 会随着序列增长
但如果注意力让我们进入任何一个状态……也许我们可以只用注意力而不需要RNN?
序列到序列编码解码模型,但它是非循环非串行结构
任务:平行语料库的机器翻译
预测每个翻译单词
最终成本/误差函数是 softmax 分类器基础上的标准交叉熵误差
自学 transformer
现在:我们定义 Transformer 网络的基本构建块:第一,新的注意力层
输入:对于一个输出而言的查询 q q q 和一组键-值对 ( k − v k-v k−v)
Query,keys,values,and output 都是向量
输出值的加权和
权重的每个值是由查询和相关键的内积计算结果
Query 和 keys 有相同维数 d k d_k dk,value 的维数为 d v d_v dv
A ( q , K , V ) = ∑ i e q ⋅ k i ∑ j e q ⋅ k j v i A(q, K, V)=\sum_{i} \frac{e^{q \cdot k_{i}}}{\sum_{j} e^{q \cdot k_{j}}} v_{i} A(q,K,V)=i∑∑jeq⋅kjeq⋅kivi
A ( Q , K , V ) = softmax ( Q K T ) V A(Q, K, V)=\operatorname{softmax}\left(Q K^{T}\right) V A(Q,K,V)=softmax(QKT)V
问题: d k d_k dk 变大时, q T k q^Tk qTk 的方差增大 → 一些 softmax 中的值的方差将会变大 → softmax 得到的是峰值 → 因此梯度变小了
解决方案:通过 query / key 向量的长度进行缩放
A ( Q , K , V ) = softmax ( Q K T d k ) V A(Q, K, V)=\operatorname{softmax}\left(\frac{Q K^{T}}{\sqrt{d_{k}}}\right) V A(Q,K,V)=softmax(dkQKT)V
输入单词向量是 queries,keys and values
换句话说:这个词向量自己选择彼此
词向量堆栈= Q = K = V
我们会通过解码器明白为什么我们在定义中将他们分开
简单 self-attention 的问题
解决方案:多头注意力
首先,通过矩阵 W W W 将 Q Q Q, K K K, V V V 映射到 h = 8 h = 8 h=8 的许多低维空间
然后,应用注意力,然后连接输出,通过线性层
MultiHead ( Q , K , V ) = Concat(head 1 , … , head h ) \text {MultiHead}(\boldsymbol{Q}, \boldsymbol{K}, \boldsymbol{V})=\text {Concat(head}_{1}, \ldots, \text { head }_{h}) MultiHead(Q,K,V)=Concat(head1,…, head h)
where head i = Attention ( Q W i Q , K W i K , V W i V ) \text {where head}_{i}=\text {Attention}\left(Q W_{i}^{Q}, K W_{i}^{K}, V W_{i}^{V}\right) where headi=Attention(QWiQ,KWiK,VWiV)
每个 Block 都有两个 子层
这两个子层都
μ l = 1 H ∑ i = 1 H a i l σ l = 1 H ∑ i = 1 H ( a i l − μ l ) 2 h i = f ( g i σ i ( a i − μ i ) + b i ) \mu^{l}=\frac{1}{H} \sum_{i=1}^{H} a_{i}^{l} \quad \sigma^{l}=\sqrt{\frac{1}{H} \sum_{i=1}^{H}\left(a_{i}^{l}-\mu^{l}\right)^{2}} \quad h_{i}=f\left(\frac{g_{i}}{\sigma_{i}}\left(a_{i}-\mu_{i}\right)+b_{i}\right) μl=H1i=1∑Hailσl=H1i=1∑H(ail−μl)2hi=f(σigi(ai−μi)+bi)
实际的词表示是 byte-pair 编码
还添加了一个 positional encoding 位置编码,相同的词语在不同的位置有不同的整体表征
{ P E ( p o s , 2 i ) = sin ( p o s / 1000 0 2 i / d m o d e l ) P E ( pos , 2 i + 1 ) = cos ( p o s / 1000 0 2 i / d m o d e l ) \begin{aligned} \begin{cases} PE(pos, 2i)=\sin \left(pos / 10000^{2 i / d_{model}}\right) \\ PE(\text {pos}, 2 i+1)=\cos \left(pos / 10000^{2 i / d_{model}}\right) \end{cases} \end{aligned} { PE(pos,2i)=sin(pos/100002i/dmodel)PE(pos,2i+1)=cos(pos/100002i/dmodel)
encoder 中,每个 Block 都是来自前一层的 Q Q Q, K K K, V V V
Blocks 被重复 6 次 (垂直方向)
在每个阶段,你可以通过多头注意力看到句子中的各个地方,累积信息并将其推送到下一层。在任一方向上的序列逐步推送信息来计算感兴趣的值
非常善于学习语言结构
its
中分离出来的注意力。请注意,这个词的注意力是非常鲜明的。decoder 中有两个稍加改变的子层
对之前生成的输出进行 Masked decoder self-attention
Encoder-Decoder Attention,queries 来自于前一个 decoder 层,keys 和 values 来自于 encoder 的输出
Blocks 同样重复 6 次
细节(论文/之后的讲座)
Byte-pair encodings
Checkpoint averaging
Adam 优化器控制学习速率变化
训练时,在每一层添加残差之前进行 Dropout
标签平滑
带有束搜索和长度惩罚的自回归解码
因为 transformer 正在蔓延,但他们很难优化并且不像LSTMs那样开箱即用,他们还不能很好与其他任务的构件共同工作
问题:语言模型只使用左上下文或右上下文,但语言理解是双向的
为什么LMs是单向的?
看到自己
解决方案:掩盖 k % k \% k% 的输入单词,然后预测 masked words
不再是传统的计算生成句子的概率的语言模型,目标是填空
Masking 太少:训练太昂贵
Masking 太多:没有足够的上下文
Transformer encoder (和之前的一样)
自注意力 ⇒ 没有位置偏差
机会均等
每层乘法 ⇒ GPU / TPU上高效
在 Wikipedia + BookCorpus 上训练
训练两种模型尺寸
Trained on 4x4 or 8x8 TPU slice for 4 days
GLUE benchmark 是由自然语言推理任务,还有句子相似度和情感
MultiNLI
CoLa
The Annotated Transformer 代码解析
jalammar 的一系列可视化简单教程
可以点击 B站 查看视频的【双语字幕】版本
【双语字幕+资料下载】斯坦福CS224n | 深度学习与自然语言处理(2019·全20讲)
相机中这有自动打闪的小图标,设置为自动打闪后,比较亮的环境下也会打开闪光灯,这时需要修改闪光灯的阀值.相关的代码vendor/mediatek/proprietary/hardware/mtkcam/legacy/platform/mt6735/core/featureio/pipe/aaa/ae_mgr/ae_mgr.cppMBOOL AeMgr::IsStrobeBVTrigger(){...
Altium Designer(AD)软件使用记录13-PCB布线部分之数据线的等长处理
常规链表的缺陷 传统的双向循环链表概念简单,操作方便,但存在有致命的缺陷,用一句话来概括就是:每一条链表都是特殊的,不具有通用性。换句话说,对于每一种不同的数据,所构建出来的传统链表都是跟这些数据相关的,所有的链表操作函数也都是数据相关的,换一种数据节点,则所有的操作函数都需要一一重写编写,这种缺陷对于一个具有成千上万种数据节点的工程来说是灾难性的,是不可接受的Linux内核链表的原理(1)把传统链表中的“链”抽象出来,使之成为一条只包含前后指针的纯粹的双循环链表,这样的链表由于不含
密码行业标准目录序号标准编号标准名称简 介1GM/T 0001-2012《祖冲之序列密码算法》规定祖冲之序列密码算法,以及基于祖冲之算法的机密性算法和完整性算法的算法结构和算法描述,并给出了运算示例。2GM/T 0002-2012
远程登录问题mysql默认情况下,只允许localhost连接,如果需要外部IP连接到mysql,需要向mysql数据库里的“user”表里添加相关授权。实例 # 让newuser用户使用newpwd密码从IP:192.168.1.3主机链接到mysql服务器 mysql>GRANT ALL PRIVILEGES ON *.* TO 'newuser'@'192.168.1....
手动编写计算信息熵、条件熵、信息增益、基尼指数的函数data = pd.read_excel('customer.xlsx', engine='openpyxl')# 信息熵# data -> 数据框 D -> 指定变量# 返回指定变量对应的信息熵def H(data, D): pk = pd.value_counts(data[D])/len(data[D]) return sum(pk*np.log2(pk)*(-1))# 条件熵# data -> 数
local_costmap:global_frame: odom_combined# robot_base_frame这个通常不是/ base link就是/ base_ footprint对于TurtleBot应设为/ base_footprintrobot_base_frame: /base_footprintupdate_frequency: 3.0publish_frequency: 1.0# 这个参数和下一个参数通常会设为相反的值。全局地图通常是静态的,因此我们通常会把这个参数设为tr
E设置也会造成工商银行网站无法访问。单击IE-工具-internet选项-安全-受信任的站点-站点, 将https://mybank.icbc.com.cn https://www.icbc.com.cn 这两个网址 添加到区域中 . 然后将 *对该区域中的所有站点都要求服务器验证(https:)*前面的小方框选上.看可以访问吗?若您网页无法显示,请您尝试使用IP进行登录。 网站首页:ht
关系模型概念关系是关系模型(关系数据模型)的数据结构,给出了存储在关系数据库中数据的描述和数据的值。我们把对数据的描述称为数据的型,也叫关系模式;把数据本身称为数据的值。作为数据库的组成部分,值是动态的数据,随着应用的变化而变化,而对值的描述是净态的,也就是型是相对不变的内容,是关系型数据库的核心。(1)元组(Tuple)元组也称记录,关系表中的每行对应一个元组,组成元组的元素称为分量。数据库中的一个实体或实体之间的一个联系均使用一个元组来表示。(2)属性(Attrbute)关系中的每列对应一
其实就是将参数列表封装成了StructObjectInspector对象,如果想要校验参数,那么通过上述的方式,可以看到,调用getAllStructFieldRefs方法,获取所有的输入列列表,遍历就可以取到参数列表了。HIVE提供了丰富的内置函数,但是对于一些复杂逻辑还是需要自定义函数来实现,对此,HIVE也提供了一些自定义的接口和类。注意在UDTF函数中,会出现传入数据异常的问题,在这里我并没有校验参数,在实际生产中是需要校验参数的。UDAF:多进一出,多对一的关系数据。顾名思义,打扫干净,下一位。
windows和Linux系统中怎么关闭8080端口占用?1. windows中打开cmdnetstat -ano | findstr 8080找到进程的pid,如:TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 6148关掉pidtaskkill /pid 6148 -t -f2. Linux找到端口对应的进...
数组(Arrays)一、数组1.1数组的定义数组: 由一组名字相同、下标不同的n(n≥1)个相同数据类型的数据元素a0,a1,a2,...,an-1构成的占用一块地址连续的内存单元的有限集合数组的处理比其它复杂的结构要简单① 数组中各元素具有统一的类型;② 数组元素的下标一般具有固定的上界和下界,即数组一旦被定义,它的维数和维界就不再改变。③