专栏首页算法微时光深度学习之线性单元(梯度下降算法)(二)

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

关于线性

线性的概念: "线性"="齐次性"+"可加性", "齐次性"是指类似于: 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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 深度学习之神经网络(反向传播算法)(三)

    神经网络最开始是受生物神经系统的启发,为了模拟生物神经系统而出现的。大脑最基本的计算单元是神经元,人类的神经系统中大概有86亿的神经元,它们之间通过1014-1...

    李小白是一只喵
  • AIOT万物互联到万物"智"联

    从广义的定义来看,AIoT是人工智能技术(AI)与物联网(IoT)在实际应用落地中的融合。

    李小白是一只喵
  • QNX4系统启动过程

    嵌入式系统的启动都是类似的,先启动一个boot程序,然后又boot控制系统的进一步加载运行.

    李小白是一只喵
  • 【论文笔记系列】自动搜索损失函数?AM-LFS:AutoML for Loss Function Search

    不过这篇文章将介绍一下如何使用AutoML技术来搜索损失函数。一般来说,损失函数都是需要我们手动设计的,以分类任务而言,我们通常会使用交叉熵。碰到数据集imba...

    marsggbo
  • 强化学习笔记9:探索和利用 exploration and exploitation

    最佳的策略是用长期的眼光来看,放弃短期高回报 获取足够策略是让策略变成全局最优的必要条件

    列夫托尔斯昊
  • 【云+社区年度征文】gshark-敏感信息搜集防泄漏工具(避坑指南)

    公众号爱国小白帽
  • 09.【Kevin聊敏捷】敏捷项目管理之Scrum三大支柱

    软件开发过程各个环节高度保持可见性;影响交付成果的各个方面保持透明;软件开发任务的完成必须等同于大家对于完成的定义。

    开心的Kevin
  • Py2和Py3共存相关问题

    将Python3根目录下将python.exe改成python3.exe,即可

    治电小白菜
  • 使用PDI从Mysql抽取数据存入到Sqlite

    自定义连接URL:jdbc:sqlite:/data/testdb.sqlite3 自定义驱动类型 org.sqlite.JDBC

    Spaceack
  • 【腾讯云】云镜-主机安全防护解决方案

    主机安全,其核心内容包括安全应用交付系统、应用监管系统、操作系统安全增强系统和运维安全管控系统。它的具体功能是指保证主机在数据存储和处理的保密性、完整性,可用性...

    云加社区

扫码关注云+社区

领取腾讯云代金券