深度学习权重初始化
神经网络训练过程中的参数学习是基于梯度下降法进行优化的。梯度下降法需要在开始训练时给每一个权重赋一个初始值。这个初始值的选取十分关键。
权重初始化
在感知器和logistic回归的训练中,我们一般将权重全部初始化为0。但是这在神经网络的训练中会存在一些问题。因为如果权重都为0,在第一遍前向计算时,所有的隐层神经元的激活值都相同。这样会导致深层神经元没有区分性。这种现象也称为对称权重现象。
随机初始化权重的一个问题是如何选取随机初始化的区间。如果权重取的太小,一是会导致神经元的输入过小,经过多层之后信号就慢慢消失了;二是还会使得Sigmoid 型激活函数丢失非线性的能力。以Logistic 函数为例,在0 附近基本上是近似线性的。这样多层神经网络的优势也就不存在了。如果权重取的太大,会导致输入状态过大。对于Sigmoid 型激活函数来说,激活值变得饱和,从而导致梯度接近于0。
因此,要高效地训练神经网络,给权重选取一个合适的随机初始化区间是非常重要的。一般而言,权重初始化的区间应该根据神经元的性质进行差异化的设置。如果一个神经元的输入连接很多,它的每个输入连接上的权重就应该小一些,以避 ...
训练神经网络不得不看的33个技巧
据说开始训练神经网络很容易,许多库和框架都以可以用30行的奇迹代码片段解决你的数据问题而自豪,给人一种即插即用的(错误)印象。常见的做法是:
123>>> your_data = # plug your awesome dataset here>>> model = SuperCrossValidator(SuperDuper.fit, your_data, ResNet50, SGDOptimizer)# conquer world here
通常可以获得简洁的API和抽象。比如:
123>>> r = requests.get('https://api.github.com/user', auth=('user', 'pass'))>>> r.status_code200
这很酷!开发者勇敢地承担了理解查询字符串、url、GET/POST请求、HTTP连接等重担,并在很大程度上隐藏了几行代码背后的复杂性。这是我们所熟悉和期望的。
不幸的是,神经网络不 ...
Contextual String Embeddings for Sequence Labeling
文章在CoNLL03 NER的F1值超过BERT达到了93.09左右,名副其实的state-of-art。考虑到BERT训练的数据量和参数量都极大,而该文方法只用一个GPU训了一周,就达到了state-of-art效果,值得花时间看看,总的来说,作者基于词的上下文字符级语言模型得到该词的表示,该模型的主要好处有:
可以在大型无标签数据集下进行训练。
利用上下文字符嵌入,可以更好地处理罕见和拼写错误的单词。
利用上下文字符嵌入,可以得到多义词的不同语境嵌入。
总的来说,使用BiLSTM模型,用动态embedding取代静态embedding,character-level的模型输出word-level的embedding. 每个词的embedding和具体任务中词所在的整句sequence都有关,算是解决了静态embedding在一词多义方面的短板,综合了上下文信息。另外该模型产生的隐藏状态输出可以用于下游任务中,比如NER任务,如下所示;
目前三种主流embedding:
A. 经典embedding
B. character-level 基于特定任务的embedding,不 ...
基于PyTorch实现word2vec模型
word2vec是google于2013年的《Distributed Representations of Words and Phrases and their Compositionality 》以及后续的《Efficient Estimation of Word Representations in Vector Space 》两篇文章中提出的一种高效训练词向量的模型, 基本出发点是上下文相似的两个词,它们的词向量也应该相似, 比如香蕉和梨在句子中可能经常出现在相同的上下文中,因此这两个词的表示向量应该就比较相似。本文前部分主要从理论方面介绍word2vec,后半部分主要基于PyTorch框架实现word2vec模型(skip-gram)。
word2vec理论
word2vec模型中比较重要的概念是词汇的上下文, 说白了就是一个词周围的词, 比如wtw_twt的范围为1的上下文就是wt−1w_{t-1}wt−1和wt+1w_{t+1}wt+1,在word2vec中提出两个模型(假设上下文窗口为3)
CBOW(Continuous Bag-of-Word): 以上下文词 ...
Transformer原理和实现
所谓 ”工预善其事,必先利其器“, BERT之所以取得这么惊才绝艳的效果,很大一部分原因源自于Transformer。为了后面更好、更快地理解BERT模型,这一节从Transformer的开山鼻祖说起,先来跟着”Attention is All You Need[1]“ 这篇文章,走近transformer的世界,在这里你再也看不到熟悉的CNN、RNN的影子,取而代之的是,你将看到Attention机制是如何被发挥的淋漓尽致、妙至毫颠,以及它何以从一个为CNN、RNN跑龙套的配角实现华丽逆袭。对于Bert来说,transformer真可谓天纵神兵,出匣自鸣!
看完本文,你大概能够:
掌握Encoder-Decoder框架
掌握残差网络
掌握BatchNormalization(批归一化)和LayerNormalization(层归一化)
掌握Position Embedding(位置编码)
当然,最重要的,你能了解Transformer的原理和代码实现。
Notes: 本文代码参考哈弗大学的The Annotated Transformer
Encoder-Decoder框架
E ...
self—attention
本系列文章希望对google BERT模型做一点解读。打算采取一种由点到线到面的方式,从基本的元素讲起,逐渐展开。
讲到BERT就不能不提到Transformer,而self-attention则是Transformer的精髓所在。简单来说,可以将Transformer看成和RNN类似的特征提取器,而其有别于RNN、CNN这些传统特征提取器的是,它另辟蹊径,采用的是attention机制对文本序列进行特征提取。
所以我们从self-Attention出发。
Attention is all your need
尽管attention机制由来已久,但真正令其声名大噪的是google 2017年的这篇名为《attention is all your need》的论文。
让我们从一个简单的例子看起:
假设我们想用机器翻译的手段将下面这句话翻译成中文:
“The animal didn’t cross the street because it was too tired”
当机器读到“it”时,“it”代表“animal”还是“street”呢?对于人类来讲,这是一个极其简单的问题,但是对 ...
认识交叉熵损失
交叉熵(cross entropy)是深度学习中常用的一个概念,一般用来求目标与预测值之间的差距,下面将主要介绍交叉熵损失。
交叉熵损失函数
理想地,我们希望神经网络可以从错误中快速地学习。在实践中,这种情况经常出现吗?为了回答这个问题,让我们看看一个小例子。这个例子包含一个只有一个输入的神经元:
我们会训练这个神经元来做一件非常简单的事:让输入1 转化为0。当然,这很简单了,手工找到合适的权重和偏置就可以了,不需要什么学习算法。然而,看起来使用梯度下降的方式来学习权重和偏置是很有启发的。所以,我们来看看神经元如何学习。
为了让这个例子更明确,我们会首先将权重和偏置初始化为0.6 和0.9。这些就是一般的开始学习的选择,并没有任何刻意的想法。一开始的神经元的输出是0.82,所以这离我们的目标输出0.0 还差得很远。从下图来看看神经元如何学习到让输出接近0.0 的。注意这些图像实际上是正在进行梯度的计算,然后使用梯度更新来对权重和偏置进行更新,并且展示结果。设置学习速率η=0.15\eta =0.15η=0.15 进行学习,一方面足够慢的让我们跟随学习的过程,另一方面也保证了学习的时 ...
cw2vec Learning Chinese Word Embeddings with Stroke n-gram Information
cw2vec是蚂蚁金服2018年提出的基于笔画的中文词的embedding 方法。文中作者提到利用笔画级别的信息对于改进中文词语嵌入的学习至关重要。具体来说,首先将词转化为笔画序列,然后通过对笔画序列进行n-gram来捕获中文单词的语义和形态信息。
实现的代码地址: https://github.com/lonePatient/cw2vec-pytorch
1.介绍
我们知道,在中文中,每个单词的字符个数往往比英文单词少,每个字符包含了丰富的语义信息。但是字符级的信息足以恰当地捕捉单词的语义信息吗?是否还有其他有用的信息可以从单词和字符中提取出来,以更好地捕抓单词的语义?例如,两个单词“木材”和“森林”在语义上紧密相关。然而,“木材”由“木”和材”两个字符组成,而“森林”由“森”和“林 ”两个字符组成。如果仅考虑字符级信息,很显然该两个单词由不同的字符组成,那么在这两个单词之间是没有共享的信息。另外,如图1(a)所示,“日”作为“智”的一部分,但是几乎不包含与"智"相关的任何语义信息。除了传统的偏旁部首,再来看看另一种形式,如图1(b)所示,“智”被分解为“矢”, ...
PyTorch常用代码段
记录一些常用的Pytorch代码,方便后续查找。
编码风格
我们试图遵循 Google 的 Python 编程风格。请参阅 Google 提供的优秀的 python 编码风格指南(见参考资料)。
在这里,我们会给出一个最常用命名规范小结:
Type
Convention
Example
Packages & Modules
lower_with_under
from prefetch_generator import BackgroundGenerator
Classes
CapWords
class DataLoader
Constants
CAPS_WITH_UNDER
BATCH_SIZE=16
Instances
lower_with_under
dataset = Dataset
Methods & Functions
lower_with_under()
def visualize_tensor()
Variables
lower_with_under
background_color=‘Blue’
常用模块
常用的 ...
BERT-Pre-training of Deep Bidirectional Transformers for Language Understanding
本文介绍一种新的语言表征模型BERT—基于Transformers的双向编码器表示。异于最新语言表征模型,BERT基于所有层的左、右语境来预训练深度双向表征。BERT是首个大批句子层面和词块层面任务中取得当前最优性能的表征模型,性能超越许多使用任务特定架构的系统,刷新11项NLP任务当前最优性能记录,堪称最强NLP预训练模型!未来可能成为新行业基础。本文参考网上各大文章,整理翻译了BERT论文,在自己学习的同时也分享给大家,欢迎交流指教。
摘要
本文介绍一种称之为BERT的新语言表征模型,即Transformers的双向编码器表征量(BidirectionalEncoder Representations from Transformers)。不同于最近的语言表征模型(Peters等,2018; Radford等,2018),BERT旨在基于所有层的左、右语境来预训练深度双向表征。因此,预训练的BERT表征可以仅用一个额外的输出层进行微调,进而为很多任务(如问答和语言推理)创建当前最优模型,无需对任务特定架构做出大量修改。
BERT的概念很简单,但实验效果很强大。它刷新了11个NLP ...