神经网络术语大百科:优化函数、激活函数、损失函数、正则方法的简介

简述关于神经网络的各种优化函数(SGD,Adagrad,Adadelta,Adam,Adamax,Nadam)、各种激活函数(Sigmoid,Tanh、Hard Sigmoid、Softplus、ReLU、ElU、PReLU、RReLU)、各种损失函数以及正则方法的简述,并附带代码实现例子。优化函数先上两张图 激活函数没有激活函数,神经元就只是一个线性函数,那么无论多少层的神经元叠加是没有意义的。而主流激活函数也随着神经网络、深度学习的发展迭代进化了许多次代。SigmoidSigmoid是S形状的意思,又因为它是逻辑回归的激活函数又叫logistic函数,函数式为$y = 1 / (1 + exp(-x))$是很早以前最常用的激活函数,其实也是有一些优点的,比如,值域位于0-1,那么对于逻辑回归,这是对于二分类的一个很自然的表达,也就是概率处处连续可导不过呢,我们观察它的形状,可以得出,Sigmoid函数在两端(靠近0和1的部分)梯度很小,这也意味着,如果神经元的输出落到了这个地方,那么它几乎没什么梯度可以传到后面,而随着神经网络的层层削弱,后面的层(靠近输入的层)没有多少梯度能传过来,几乎就“学不到什么”了。这叫做梯度消失问题,一度是阻碍神经网络往更深的层进化的主要困难,导致深度学习专家们绞尽脑汁想了许多方法来对抗这个问题,比如“Xavier and He Initialization”,比如我们要把weight随机初始化为如下的范围,sigmoid的另一个问题是它不是0均值的,Sigmoid函数的输出值恒大于0,这会导致模型训练的收敛速度变慢。举例来讲,对,如果所有均为正数或负数,那么其对的导数总是正数或负数,这会导致如下图红色箭头所示的阶梯式更新,这显然并非一个好的优化路径。深度学习往往需要大量时间来处理大量数据,模型的收敛速度是尤为重要的。所以,总体上来讲,训练深度学习网络尽量使用zero-centered数据 (可以经过数据预处理实现) 和zero-centered输出。如今,sigmoid函数应用最广泛的在于其变种softmax在多元分类中,比如手写数字识别,经过卷积神经网络的处理,最后我们需要网络输出每个预测的概率值,最后预测为某一个数字,这里就需要用到softmax,以下是softmax的Keras代码,注意其中一个trick,e = K.exp(x - K.max(x, axis=axis, keepdims=True))这里每个分量减去最大值是为了减少计算量。1234567891011121314151617181920212223def softmax(x, axis=-1): """Softmax activation function. # Arguments x : Tensor.…

0 Comments

理解一维卷积

理解一维卷积下面是一个利用CNN进行NLP中的情感分类的例子,上图中,输入为表示为词表为d=5,长度为7的矩阵的句子,1D卷积核为长度分别为(2,3,4)的各两个,经过卷积并激活函数后,各自产生了(4x1, 5x1, 6x1)的各两个feature map,每个feature map经过一次1D max pooling后(即取每个feature map的最大值)再concatenate为一个6x1的1D向量,经过一个全连接层再softmax激活即可进行情感分类预测。  

0 Comments

RECURRENT NEURAL NETWORKS TUTORIAL, PART 1 – INTRODUCTION TO RNNS

RNN,也即是递归神经网络,是许多NLP任务的流行处理模型。本部分中将简介RNN。本部分主要实现此模型– recurrent neural network based language model,模型有两个作用:可以基于出现的概率对句子进行打分,可以对于语法和语义正确性进行评估,从而应用于机器翻译等领域。可以依据概率生成新的语料。##什么是RNNRNN背后的核心理念是利用序列的信息。传统的神经网络常常假设输入(输出)是独立于彼此的,这对于某些应用来说是不可行的,例如NLP任务,如果你需要预测下一个单词是什么,你不可能不用到之前的单词的信息。RNN之中的recurrent指的就是循环往复的意思,网络对于序列数据的每个元素进行同样的操作,网络的输出取决于之前的计算。另一种理解RNN的方法则是把它们看成是有记忆的网络,记忆收集从开始到现在被考虑的信息。理论上RNN可以利用任意时间长度的信息,但是实际上这比较困难。以下是RNN的典型结构:以上的结构将RNN展开成完整的网络。例如,我们需要处理一个5层的序列,那么就需要展开成5层:每层对应一个词。$$x_t$$是$$t$$时刻的输入$$s_t$$是$$t$$时刻的隐藏状态,代表网络的“记忆”,计算公式为$$s_t = f(Ux_t + Ws_{t-1})$$,其中$$f$$通常是tanh函数或者RELU函数。$$o_t$$是$$t$$时刻的输出,如果我们想预测下一个词,那么计算公式为$$o_t = softmax(Vs_t)$$,指的是在整个词表内词的概率值。对于以上有几点需要提示:我们可以把隐藏状态$$s_t$$看成是网络的“记忆”,其捕捉到在之前所有时间的信息。输出$$o_t$$只取决于在$$t$$时刻的记忆。而在实际上,由于长期依赖问题,$$s_t$$很难捕捉到很长时间以前的信息。RNN每个step中的参数($$U,V,W$$)是相同的,这使得学习的代价减小许多。取决于实际任务,我们可能并不需要每个step都有输入和输出。##RNN的实际应用以下是RNN在NLP领域的一些实际应用。###语言模型与生成语句在给定之前词语的情况下我们希望产生出下一个词语是什么。语言模型的作用就是让我们可以衡量一个句子的可能性,这对于机器翻译是很重要的(可能性越高的更可能正确)。而语言模型的另一个作用则是预测下一个词语是什么,我们可以通过在输出的概率词汇中采样得到,。对于语言模型,输入是一序列的词语(每一个词语都是one-hot表示),输出则是一序列的预测的词语。在训练时我们设置$$o_t = x_{t + 1}$$,因为这一时刻的输出就是下一时刻的输入。关于语言模型与生成语句的论文:Recurrent neural network based language modelExtensions of Recurrent neural network based language modelGenerating Text…

0 Comments

note for CS224d:1

最近学习了斯坦福的CS224d课程,该课 程的主要内容是神经网络在自然语言处理领域的应用。 这里记录相关的学习笔记,大概分 成以下几个部分:word2vec,窗口分类,神经网络,循环神经网络,递归神经网络,卷积 神经网络。 ##为什么需要深度学习 传统的机器学习方法都是人为的设计特征或者表示,深度学习的目的是希望能够通过神经网络让机器自动学习到有效的特征表示,这里所说的深度学习更偏向于关注各种类型的神经网络。探索机器学习的原因主要有以下几方面:   人工设计的特征常常定义过多,不完整并且需要花费大量的时间去设计和验证 自动学习的特征容易自适应,并且可以很快的学习 深度学习提供了一个弹性的,通用的学习框架用来表征自然的,视觉的和语言的信息。 深度学习可以用来学习非监督的(来自于生文本)和有监督的(带有特别标记的文本,例如正向和负向标记) 在2006年深度学习技术开始在一些任务中表现出众,为什么现在才热起来? 深度学习技术受益于越来越多的数据 更快的机器与更多核CPU/GPU对深度学习的普及起了很大的促进作用 新的模型,算法和idea层出不穷 通过深度学习技术提升效果首先发生在语音识别和机器视觉领域,然后开始过渡到NLP领域 深度学习在所有的NLP层次(音素、形态学、句法、语义)都得到了应用,而所有的NLP层次的表示都涉及到向量(Vectors),下面主要讲如何用向量来表示词。 ##词向量 ###语义词典 我们要如何表示一个词的意思呢?常识上,在词典中我们通过更加简单常用的词来构成例句来解释一个词的意思。那在计算机中,我们通常使用Wordnet来表示词义: ![](/images/2016/06/Screenshot from 2016-06-01 20-44-21.png) 但语义词典存在如下问题: 语义词典资源很棒但是可能在一些细微之处有缺失,例如这些同义词准确吗:adept, expert, good, practiced,…

0 Comments