美文网首页大数据 爬虫Python AI SqlArtificial Intelligence
深度学习之线性单元(梯度下降算法)

深度学习之线性单元(梯度下降算法)

作者: Lee_5566 | 来源:发表于2018-08-24 14:27 被阅读16次

    关于线性

    线性的概念:
    "线性"="齐次性"+"可加性",
    "齐次性"是指类似于: f(ax)=af(x),
    "可加性"是指类似于: f(x+y)=f(x)+f(y),

    而对于单层感知器来说,是无法处理非线性的问题。非线性及不符合上述的条件的集合。
    例如异或问题:


    image.png

    无法找到一个合适的直线,将两边分离开来。
    所以这时候就需要用到了delta法则。

    delta法则

    delta 法则的关键思想是使用梯度下降(gradient descent)来搜索可能权向量的假设空间, 以找到最佳拟合训练样例的权向量。

    由于在真实情况下,并不能保证训练集是线性可分的。因而,当训练集线性不可分时该如何训练感知器呢?这时我们使用delta法则,通过这种方式可以找出收敛到目标的最佳近似值。

    其原理是:


    image.png

    因为其激活函数是线性的,所以一般被称为线性单元。

    激活函数:


    image.png

    用向量表示就是:


    image.png

    当然在这一种情况下,还需要考虑其每次计算后的结果的误差,根据误差来调整权值。
    而这就需要用到代价函数:


    image.png

    其中y为期望输出,y`为实际输出。

    在求得误差结果最小的情况下,就是我们所求的最优解。注:这里的1/2只是为了后面的计算方便,没有实际意义。

    为了求得代价函数最小,因为:


    image.png

    对路所有的样本的误差和来说:


    image.png

    所以公式可以改写为:


    image.png

    因为对于样本来说(其实是监督学习的方式),x和y都是已知的,所以上述的公式中其实就是w和E(w)的关系。对整个代价函数来说,其实只有一个变量w。

    这样如果想要获取E(w)的最小值,及误差最小,只需要获取的上述变量的最小值即可。因此我们可以使用导数的方式来求取最小值。当然计算机是不会解方程的,所以只能是一步一步的尝试出最小值。

    因此引进梯度下降算法:


    image.png

    通过不断的改变w的值,来找到使得E(w)最小的位置:


    image.png

    对w求导结果:


    image.png

    这样就获取的权值调整公式。

    我们可以来看一下推断出来的公式和上一章的单层感知器的差异:


    image.png

    其实只有激活函数不一样!!!
    下面举个简单的例子说明一下:

    问题

    输入一组工作年限 [[5], [3], [8], [1.4], [10.1]];
    期望输出其代表的年薪:[5500, 2300, 7600, 1800, 11400]
    通过随意输入一个工作年限来预算其的年薪。

    代码:

    # coding=utf-8
    # numpy 支持高级大量的维度数组与矩阵运算
    import numpy  as np
    # Matplotlib 是一个 Python 的 2D绘图库
    import matplotlib.pyplot as plt
    
    
    #定义坐标,设定5组输入数据,每组为(x0,x1,)
    X=np.array([[1,5],
                [1,3],
                [1,8],
                [1,1.4],
                [1,10.1]]);
    
    #设定输入向量的期待输出值
    Y=np.array([5500,2300,7600,1800,11400]);
    
    #设定权值向量(w0,w1)
    W = np.array([0,0]); 
    
    #设定学习率
    lr = 0.01;
    #计算迭代次数
    n=0;
    #神经网络输出
    O=0;
    
    def  updateW():
        global  X,Y,W,lr,n;
        n+=1;
        O=np.dot(X,W.T);
        #计算权值
        W_Tmp = lr*((Y-O.T).dot(X))/int(X.shape[0]);
        #更新权值向量
        W = W+W_Tmp;
    
    def draw():
        global W;
    
        x1=[5,3,8,1.4,10.1];
        y1=[5500,2300,7600,1800,11400];
    
        #绘制分割线需要的等差数列
        x=np.linspace(0,12);
        #创建子图
        plt.figure();
        #根据坐标绘图 激活函数:y=x1W1+w0
        plt.plot(x,x*W[1]+W[0],'r');
        plt.plot(x1,y1,'*');
        plt.show();
    
    if __name__ == '__main__':
        #设置迭代次数
        for index in range (100):
            updateW();
            #获取组合器输出结果
            O=np.dot(X,W.T);
            #打印 实际值
            print O;
    
        draw();
    

    执行结果:


    image.png

    参考:
    线性学习器
    https://blog.csdn.net/wasd6081058/article/details/7886697
    零基础入门深度学习(2) - 线性单元和梯度下降(写的非常通俗易懂!!!感谢作者)
    https://www.zybuluo.com/hanbingtao/note/448086
    网易视频课程——深度学习入门系列
    http://study.163.com/course/courseMain.htm?courseId=1004111045

    相关文章

      网友评论

        本文标题:深度学习之线性单元(梯度下降算法)

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