• 学习Make your own neural network 记录(一)


    1. threshold临界点:当training data足够多的时候,便会达到临界点, 使得神经元释放output

    2. Activation functions: 激励函数,在神经网络中,利用激励函数可以把线性函数转化为平滑的曲线型函数

      sigmoid函数: sigma(x) = frac{1}{1 + e^{-x}}     当x=0时,y=0.5

      

    在开始阶段,会有很多input进入神经元:

     在input数量不足时,sigmoid函数会一直压制output,直到pass临界点

    3. weight, 每条路径都有一个weight,weight可以增强input,也可以减弱input,用来和input数值相乘

    例如:在下图中,计算layer2的output,首先1->1, 2->1,两条路径,所以x = 1.0*0.9 + 0.5*0.3, 然后带入sigmoid函数,算出output为0.7408

    矩阵相乘,来自动计算outputs

    待续。。。。

    ------------------------------------------------------------------------------------分割线---------------------------------------------------------------------------

    多层terms:

    每当计算出一次output的时候,和training data进行对比, 得到误差,然后用之前的方法来完善神经网络。

    如果有大于1条的weight 来得出output, 得出的error, e = (t-o),要按照weight贡献度的比例来进行修正分配。

    Backpropagating(反向传播算法):用error反向modify ,反向按比例输出Error(hidden)

    如图:

    通过反向遍历每条路径占的比例,分配相对的e值,然后用e去modify每条路径的weight

    引用原文:Neural networks learn by refining their link weights.

    This is guided by the error- the difference between the right answer given by the training data and their actual output: e = t - o

    用矩阵相乘来实现自动化反向传播,给机器语言提供了实现的可能性(w为每条路径的weight):

    第二种相对简单的矩阵相乘来实现反向传播遍历,由于每条路径的weight是不同的,同一个output对应的子节点.

    我们选取weight值相对占比重大的来节约计算时间,但失去精度, 把矩阵的每一行换成每一列,名字叫transposing a matrix(转置矩阵)

    Take a well deserved break~! :-)  

    在了解如何去更新神经网络中的那些weights,先看一下梯度下降(Gradient Descent)这个数学术语:

    比如我们在一座大山上的某处位置,由于我们不知道怎么下山,于是决定走一步算一步,也就是在每走到一个位置的时候,求解当前位置的梯度,沿着梯度的负方向,也就是当前最陡峭的位置向下走一步,然后继续求解当前位置梯度,向这一步所在位置沿着最陡峭最易下山的位置走一步。这样一步步的走下去,一直走到觉得我们已经到了山脚。当然这样走下去,有可能我们不能走到山脚,而是到了某一个局部的山峰低处。可以看出,梯度下降不一定能够找到全局的最优解,有可能是一个局部最优解。当然,如果损失函数是凸函数,梯度下降法得到的解就一定是全局最优解。

    在遇到复杂的机器学习算法时,比如去modify error时,可以考虑用梯度下降法,逐步的试探,分析问题,得出的答案不一定是最精确的,但是也是有效的答案

    举个栗子:

    假设现在有一个复杂的算法y = (x-1)^2 + 1, 在这个方程式中,y是神经网络中所谓的error,所以我们要想办法找到x的值=>在神经网络中,也就是weight的值,去最小化所谓的error,首先看一下这个方程式的图:

    在这个方程式中,如果不知道如何求得x的值,可以用梯度下降法,逐步的去用测试的x值进行modify,不停地有规律的modify x的值,直到x的迭代变化变得非常小的时候,我们就十分接近最小的y值了

    在真实的神经网络算法中,每个error有可能有不同的很多的weight路径,也就是说有很多变量,这时候梯度下降方法可以逐渐找到答案。。

    同时,在神经网络中,会有很多坑,就像山会有很多山谷一样,所以我们在做梯度下降时,要选择不用的X起点,去找到真正的最小值:

    待续。。。

     ------------------------------------------------------------------------------------分割线---------------------------------------------------------------------------

    calculus(微积分),用来表示变量之间的关系,所以在神经网络用来表示error function和link weight 之间的关系:

    tn-on的平方,也就是误差的平方,为什么要用平方表示呢?

    (目标值-实际值)的平方。我们采用这种函数测量误差主要是基于如下几点:

    1.梯度下降法中求解斜率的时候比较容易。

    2.这个误差函数时平滑而连续的,能够很好的发挥梯度下降法的优势

    3.当靠近最小值的时候,梯度值越来越小。这意味着我们将使用平滑的步长靠近最小值,从而避免越过最小值的风险。

     

     

    接下来通过微积分推倒,以及sigmoid的变形:

    得出最终公式,也就是Error和weight之间的关系:

    对于output,input,关于trainingdata的要求,首先trainingdata要符合逻辑,能真实的处理实际问题; 其次每个slape不能调度过大; 然后zero值很可能会导致整个机器学习的神经网络失去功能;hidden layers的link weights需要是随机的,并且跨度小的; 通常input值都在0.01-0.99, 或者-1.0 到+1.0; 通常output都在0以上,1以下,一个比较好的range是0.01-0.99。

    接下来用python写一个training session,做图像识别,请见下章

  • 相关阅读:
    javascript数组对象
    jquery、javascript实现(get、post两种方式)跨域解决方法
    js检查字符串的包含关系
    element——message消息提示
    js把mysql传过来的时间格式化为:0000-00-00 00:00:00
    beego orm操蛋问题:操作都需要主键
    element——message-box
    VUE.js全局变量的定义
    element el-upload组件获取文件名
    go遍历某个文件夹
  • 原文地址:https://www.cnblogs.com/ChrisInsistPy/p/9002880.html
Copyright © 2020-2023  润新知