美文网首页神经网络机器学习
机器学习之神经网络

机器学习之神经网络

作者: Vophan | 来源:发表于2019-01-15 23:24 被阅读21次

什么是神经网络

就是使用了平滑的激活函数的多层感知机

激活函数

什么是激活函数呢?

激活函数就是从输入值到对应输出值的映射关系


  • 阶跃函数

  • sigmoid函数
    h(x) = \frac{1}{1+e^{-x}}

    image.png

    这就是sigmoid函数图像

image.png

这是阶跃函数的图像

对比二者,我们可以发现阶跃函数只有0,1两种状态,而sigmoid可以取到之间的每一个值,这也是感知机与神经网络的区别


相同之处:

阶跃函数和 sigmoid 函数虽然在平滑性上有差异,但是如果从宏观视角看图 3-8,可以发现它们具有相似的形状。实际上,两者的结构均是“输入小时,输出接近 0(为 0);随着输入增大,输出向 1 靠近(变成 1)”。

还有,阶跃函数与sigmoid都是非线性函数6

而且,这里只能使用非线性函数,为什么不能使用线性函数?

因为如果使用线性函数就无法体现多层网络带来的优势。

比如:

我们使用线性函数
h(x) = c*x
我们构建了三层网络,但是最后一层输出值是什么呢?
h(x) = c^3*x
这么做没有任何意义。

  • ReLu函数

    {88%}

\begin{equation} h(x)=\left\{ \begin{array}{**lr**} x\qquad(x>0)\\ 0\qquad(x\leq0)\\ \end{array} \right. \end{equation}
实现也很简单:

def relu(x):
    return np.maximum(0,x)

刚才看了一下pytorch的教程视频,他提到了这个激活函数,有一点新的理解:

为啥激活函数必须是非线性函数?

一部分原因是前面说的,为了发挥多层网络的优势,但是这么说其实还是很模糊,其实就是线性函数在对输入值的加权和(以及偏差)分类时,做的太差,所以只能引入非线性函数解决这个问题。


补充:

在手写神经网络的时候,对偏置有一些新的理解:

偏置其实表示的是每一个神经元的激活的容易程度,那么这么看来其实就是每个神经元都有一个偏置,而对于输入层的神经元,其实偏置并没有什么卵用。

但是在表示的时候,我们可以发现,第一层偏置其实对应的是第二层的神经元的偏置。


代码:

import numpy as np
def init_network():
    network = {}
    network["w1"] = np.array([[0.1,0.3,0.5],[0.2,0.4,0.6]])
    network["b1"] = np.array([0.1,0.2,0.3])
    network["w2"] = np.array([[0.1,0.4],[0.2,0.5],[0.3,0.6]])
    network["b2"] = np.array([0.1,0.2])
    network["w3"] = np.array([[0.1,0.3],[0.2,0.4]])
    network["b3"] = np.array([0.1,0.2])
    return network

def sigmoid(x):
    return 1/(1+np.exp(-x))

def identity_function(x):
    return x

def forword(network, x):
    w1, w2, w3 = network["w1"], network["w2"], network["w3"]
    b1, b2, b3 = network["b1"], network["b2"], network["b3"]
#     print(b1,b2,b3)
    a1 = np.dot(x,w1) + b1
    z1 = sigmoid(a1)
    a2 = np.dot(z1,w2) + b2
    z2 = sigmoid(a2)
    a3 = np.dot(z2,w3) + b3
    y = identity_function(a3)
    return y

network = init_network()
x = np.array([5.0,3.0])
y = forword(network, x)
print(y)

补充:

输出层的激活函数不同于前几层的激活函数,

对于回归问题,使用恒等函数,对于分类问题,使用softmax函数


损失函数:

用来度量模型性能好坏程度的指标

通常使用:

均方误差和交叉熵误差

  • 均方误差
    E = \frac{1}{2}\sum_k(y_k-t_k)^2

  • 交叉熵误差
    E = -\sum t_k\log y_k
    交叉熵误差就得提到one-hot表示方法,

    tk就是one-hot表示的标签向量,(如果第二个标签为真,则向量为:[0,1,0,0...0])

    yk是神经网络的输出,输出越大,交叉熵误差越小,也是说这个标签是正确的可能性越大。

    实际上,使用的时候,会给Yk加一个delta值,防止Yk趋于零的时候,log趋于无穷。


接着损失函数,我还想说一下:

mini-batch学习,我们刚才说道损失函数,对于一定数量的数据集,我们要求取损失函数,就要把每一个样本的损失函数加到一起在除以N,进行规范化。

但是有一个问题就是,如果数据量特别的大,那么这个过程就变得很耗时,所以我们要采用mini-batch的学习方法,对数据集进行抽样,来计算损失函数。


为什么要设置损失函数?

我们来理一下这个过程,就是我们要通过训练数据来得到最好的参数值,权重和偏置,但是我们怎么知道现在选取的参数值的好坏呢?

我们就是通过损失函数来量度模型的好坏,同样的这样也给我们的训练有了一个目标,就是尽可能的让损失变得最小。

可是我们怎么才能让损失函数最小呢?

这就用到了梯度下降法。通过对参数的梯度的判断,比如说在我们取到某一个参数的时候,他的梯度(导数)不等于零,那么我们就要在这个点的梯度下降的点取点,知道参数对应的梯度为0

梯度,就是对应每一个参数的偏导数汇总到一起的向量就是梯度
\Bigl(\frac{\partial f}{\partial x_0},\frac{\partial f}{\partial x_1}\Bigr)%20\Bigl(\frac{\partial%20f}{\partial%20x_0},\frac{\partial%20f}{\partial%20x_1}\Bigr%29)


其实,损失函数就是对于输出层的一个说法。

只有在输出层才有输出值与监督值的对比。


对于梯度的求法其实就是:

对于每个参数求导数,导数怎么求,就是去一个特别短的区间:
f(x) = \frac{f(x+h)-f(x)}{h}
这个h我们取做1e-4,之前取做1e-5,但是后来存在一个舍入误差,就是当数据特别小的时候,会被计算机处理时当成0。

而且为了减小误差,我们还采用了中心差分的方法来求取导数。

梯度的方向是数值下降最快的方向。


梯度法

enter image description here

η 是学习率,learning rate就是确定每一次梯度下降多少(多大程度更新参数)

在下降过程中,参数会不断更新,learning data既不能太大也不能太小。

def gradient_descent(f, init_x, lr=0.01, step_num=100):
    x = init_x

    for i in range(step_num):
        grad = numerical_gradient(f, x)
        x -= lr * grad

    return x

实验结果表明,学习率过大的话,会发散成一个很大的值;反过来,学习率过小的话,基本上没怎么更新就结束了。也就是说,设定合适的学习率是一个很重要的问题。


误差反向传播:

根据链式法则:

我们可以知道每一个计算图上的误差都等于上游传来的局部导数*当前的局部导数。

相关文章

  • 人工智能,神经网络,机器学习,深度学习和大数据作弊表

    看到这些备忘单不明觉厉,收藏之。 原文在此 神经网络 神经网络图 神经网络公式 机器学习概述 机器学习:Sciki...

  • 深度学习概念和基础

    深度学习是以神经网络为基础的,神经网络是机器学习的一种算法。 关于机器学习中的神经网络: 机器学习之神经网络1前向...

  • 100天搞定机器学习|day37 无公式理解反向传播算法之精髓

    100天搞定机器学习|Day35 深度学习之神经网络的结构 100天搞定机器学习|Day36 深度学习之梯度下降算...

  • 神经网络简述

    一、什么是神经网络 机器学习中谈论的神经网络是指“神经网络学习”,或者说,是机器学习和神经网络这两个学科领域的交叉...

  • 神经网络简述

    一、什么是神经网络 机器学习中谈论的神经网络是指“神经网络学习”,或者说,是机器学习和神经网络这两个学科领域的交叉...

  • 《Python神经网络》5——机器学习简介

    1.机器学习,神经网络,深度学习和人工智能之间有什么关系? · 神经网络是深度学习的“根基”。 · 深度学习是机器...

  • 机器学习入门

    机器学习:发展与未来 人工智能 > 机器学习 > 深度学习 > 神经网络 多种机器学习技术:深度学习,强化学习,蒙...

  • 2018-11-01

    人工智能包含机器学习,机器学习包含神经网络,人工智能是一种概念,机器学习和神经网络是实现人工智能的办法,以前的人工...

  • 机器学习与深度学习(一):简介

    机器学习与人工智能、深度学习、神经网络的关系 是学科之间的层级包含关系人工智能>机器学习>深度学习>神经网络 现如...

  • 吴恩达教你入门神经网络

    人工智能目前很火。人工智能主要是机器学习。机器学习主要是深度学习。深度学习必然要接触人工神经网络。 人工神经网络是...

网友评论

    本文标题:机器学习之神经网络

    本文链接:https://www.haomeiwen.com/subject/tgaudqtx.html