深度学习超简单入门

深度学习超简单入门

深度学习部分

线性和非线性

线性:当存在 W W W b b b使得式子
f ( x ) = x ⋅ W + b x ∈ R d i n , W ∈ R d i n × d o u t a n d b ∈ R d o u t f(x) = x \cdot W + b \quad\\ x \in \mathbb{R^{d_{in}}} , W \in \mathbb{R^{d_{in} \times d_{out} }} and \quad b \in \mathbb{R^{d_{out}}} f(x)=xW+bxRdin,WRdin×doutandbRdout
非线性:不满足线性条件的,比较典型的是XOR

当然,我们需要认识到,在低维的非线性在高维度也许就是线性。在线性方法的机器学习中,我们的任务就是找到一个 W W W b b b 的优解。但是我们的问题在大多数情况下都是非线性的, 我们往往会通过加入核函数(或激活函数)来使得我们的模型能够适应线性不可分的问题。

激活函数

激活函数一般同样会选择一些非线性函数。比较典型的有:

  1. sigmoid(logistic)
    σ ( x ) = 1 1 + e − x \sigma(x) = \frac{1}{1+e^{-x}} σ(x)=1+ex1
  2. tanh
    t a n h ( x ) = e 2 x − 1 e 2 x + 1 tanh(x) = \frac{e^{2x} -1} {e^{2x} + 1} tanh(x)=e2x+1e2x1
  3. ReLU
    R e L U ( x ) = m a x ( 0 , x ) = { 0 x &lt; 0 x o t h e r s ReLU(x) = max(0,x) = \left \{ \begin{array}{lr} 0 \quad x &lt; 0\\ x \quad others \end{array} \right . ReLU(x)=max(0,x)={0x<0xothers
    忘了在哪个人的课程看到过(好像是吴恩达),ReLU可以说是表现最好的激活函数。用激活函数的时候可以多考虑一下这个。

训练集,测试集和验证集

我们比较熟悉的是训练集和测试集。使用训练集来训练我们的模型,并使用测试集来检验我们模型的效果。但是,当我们在开发多个模型并比较性能时,例如,我们要同时比较MLP和NB训练的模型时,并且想对MLP和NB模型进行优化操作(例如调参时),我们如果用测试集同时作为优化依据和对比依据会让人们对模型这个参数时的泛化性存疑。将数据集分为训练集,验证集和测试集是非常有效的。我们用训练集开发模型,用验证集优化模型,用测试集比较不同模型的性能是一个比较好的选择。
这里还涉及到一种评价模型的方法。就是用所有数据集训练一个模型,作为标准。然后用训练集训练多个模型,并使用测试集比较标准数据集和训练集训练的数据集的输出。

从NN到MLP

NN,感知器,算是最简单的线性模型,可以参考我们在线性和非线性中一节的线性模型。
MLP,多层感知器,顾名思义就是多层的NN
例如, 二层的MLP(即一个隐层的MLP)的公式是:
M L P 1 = a ( x W 1 + b 1 ) W 2 + b 2 MLP_1 = a(xW_1 + b_1)W_2 + b_2 MLP1=a(xW1+b1)W2+b2
当然,这样我们还是只能完成线性可分的任务。但是,加入我们在前面提到过的激活函数(我们一般在输入前加上激活函数),就是非线性的了。这里假设我们使用ReLU。
M L P 1 − R e L U = R E L U ( a ( R e L U ( x W 1 + b 1 ) ) W 2 + b 2 ) MLP_{1-ReLU} = RELU(a(ReLU(xW_1 + b_1))W_2 + b_2) MLP1ReLU=RELU(a(ReLU(xW1+b1))W2+b2)

损失函数

深度学习有很多的损失函数,不同的应用也应该使用不同的损失函数。损失函数总的来说就是计算两个向量的的相差程度,并将结果化为标量。常见的损失函数有:
这里设预期输出和分类器输出的差值为m。

  1. Log:
    L l o g = l o g ( 1 + e x p ( − m ) ) L_{log} = log(1+ exp(-m)) Llog=log(1+exp(m))
  2. Logistic(也叫二元交叉熵):
    L = − y a l o g y p − ( 1 − y a ) l o g ( 1 − y p ) L = -y_a logy_p - ( 1 - y_a) log( 1- y_p) L=yalogyp(1ya)log(1yp)
    预测规则是:
    P r e d i c t i o n = { 0 y p &lt; 0.5 1 y p ≥ 0.5 Prediction = \left \{ \begin{array}{lr} 0 \quad y_p &lt; 0.5\\ 1 \quad y_p \ge 0.5 \end{array} \right. Prediction={0yp<0.51yp0.5
    当我们使用Logistic时,假设输出是经过Sigmoid处理过的。

关于交叉熵详细的说明可以参考博客:
https://blog.csdn.net/Softdiamonds/article/details/80177023
还有其他更多的损失函数,需要根据具体项目的具体内容来确定。

神经网络的计算

前向传播

前向传播就不用说了,正常的计算下来就行。这里需要着重说明的是初始权重的设置。初始权重的设置是非常重要的。好的初始权重不仅可以减少训练次数,还可以避免一些陷阱。

反向传播

反向传播在于设置一个损失函数节点N,该节点应该具有标量输出。然后从i节点通过前向传播直到到达N节点。这时候可以得到i节点的梯度为:
d ( i ) = ∂ N ∂ i d(i) = \frac{\partial{N}}{\partial{i}} d(i)=iN
实际上,我们使用链式传导法则就可以一次算出所有节点的梯度值。

优化算法

我们比较常用的是随机梯度下降(SGD)。SGD的核心思想是梯度越小,下降越慢。但是这样很容易进入局部最优,于是SGD还引入了随机性,从而可以跳出局部最优的情况。

梯度消失和梯度爆炸

梯度消失指的是梯度变得接近0,梯度爆炸指的是梯度变得非常高。这两个都是严重的问题。在深层网络中,这两个问题会非常严重。比如我在训练GoogleNet的时候,就不止一次的碰到了梯度消失的问题。
可以参考网址更加详细的了解:http://neuralnetworksanddeeplearning.com/chap5.html

调整超参

虽说和传统的机器学习相比,深度学习的一个优点就是不需要人们大量的调整参数,模型会自动的学习到一些参数。但是这不意味着深度学习不需要调参。比较常见的需要调整的超参有学习率优化算法的参数和batch size等。

CNN和RNN

CNN,卷积神经网络
RNN,循环神经网络
这个要展开说还是挺费时间的,加上网上资料比较多,这里就不说了。

CNN 和 RNN in NLP

在NLP中,CNN善于抽取数据中有意义的局部模式。其可以接受任意长度的输入并抽取有意义的局部模式。CNN对于单词顺序敏感,但是对于其在输入中的位置不敏感(CNN是局部视野的)。
RNN比较适合一些序列任务。和CNN不同的是,它具有对词顺序的敏感性。一般RNN很少单独作为一个网络,更多的时候是作为一种数据的处理手段。例如,可以把RNN的输出给CNN,来完成一些特定的任务。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值