我不是主攻人工智能、深度学习偏向,然则作为盘算机相关领域的学习者,若是不了解下,总觉得已经跟不上时代了,况且,人工智能真的是大势所趋,学会了,能够实验用在差别领域。

本文将使用回归的头脑来求解二元一次方程的最佳解,明白深度学习的基本头脑。

假设,对于二元一次方程:

y = a * x + b

假设我们能够采集到一组数据(x,y),这些值都是知足以上等式的,然则,现实生活中往往不能这样顺遂(若是采集的值是正确值,直接列方程组就能求出a和b),我们采集到的每组(x,y)都存在一定误差,以是,现实中采集到的数据应示意为:

y = a * x + b + r

r示意误差,这个时刻,我们需要通过这一组数据,来找到一组a和b,使得 y = a * x + b 和理想的情形越靠近。

为了利便示意,将r示意为:

r = y - (a * x +b)

由于这个值可能为负数,以是用r的平方来示意这个误差,记为:

loss = [ y - (a * x + b)] 2

这里用loss记,实际上就明白为模子训练过程中的“损失”,我们需要找到到一组a和b,使得loss最小。

在数学中,我们会用到极限的头脑求解最小值,然则,在深度学习中,是若何找到这个最小loss的呢?

这里就需要提到梯度下降的头脑(这些内容在 《盘算方式》 这门学科中有详细的说明),通俗地明白,在本文的二元一次方程中,就是初始化一个a和b,然后举行一定次数的迭代,在每次迭代中,调整a和b的值。

将loss示意的函数划分对a和b求偏导数:

dei a = 2 * [ y - ( a * x + b ) ] * x

dei b = 2 * [ y - ( a * x + b ) ]

我们每次调整a和b的值使用如下方式:

new a = a - dei a * learn_rate

new b = b - dei b * learn_rate

实际上,在每轮迭代中,我们将会用收集到的每组数据都来盘算dei a和dei b,最终使用平均值,示意经由这一轮,参数a和b需要被调整的巨细。

然则,我们发现,调整参数的时刻,dei a和dei b还划分乘以了一个learn_rate,这个learn_rate在深度学习模子训练中叫学习率,一样平常取一个比较小的值,0.001、0.01等,可以通过实验找到最优的值。若是不乘以learn_rate,对a来说,每次需要调整dei a,这个值是很大的,而且会泛起不能收敛的情形:

从上图中可以看到,对同一个loss函数,若是使用0.05的learn_rate,会导致loss在最小值四周颠簸,不能找到最小值,而使用0.005的学习率,每次调整的局限更小,且能正确地找到loss的最小值。

通过一定次数的迭代,我们就能找到一组a和b的值,这组a、b能够使得loss尽可能小,甚至为0,我们近似以为这个方程就是理想情形下的方程:

y = a * x + b

这时,若是给出一个值a1,就可以凭据上式获得一个y1值,这就是我们所说的展望值。

这个例子虽然比较简单,然则包含了深度学习的精髓头脑。无论多大的网络模子、数据量,实际上都是对一组参数不断地举行调整,使得在这组参数的情形下,所获得的一个函数关系,能够让loss的值尽可能小(固然,这种尺度可以凭据差别需求举行修改),换句话说,就是找到一组参数,使得一个关系式尽可能趋近给定的一组数据中的每个映射关系(数据和标签的映射),然后再凭据这个关系式,对新给定的值,给出响应盘算效果,这就是就是展望值。

附,本文涉及的代码和数据:

import numpy as np

'''
y = a*x+b + noise

loss = (a*x+b - y)**2

die a = 2(a*x+b-y)*x
die b = 2(a*x+b-y)

'''


# 盘算损失loss,神经网络模子训练过程中,一样平常会在每一轮都输出一次,查看训练效果
def get_loss(a, b, points):
    sum = 0
    for i in points:
        x = i[0]
        y = i[1]

        t = (a * x + b - y) ** 2
        sum = sum + t

    # 由于有多组数据,这里求平均值,示意当前a,b情形下,表达式和这组数据的平均误差
    average_loss = sum / float(len(points))

    return average_loss


# 求梯度,调整a,b的值,这是参数能够被“训练”的要害部门
def step_grad(a, b, learn_rate, points):
    da_sum, db_sum = 0, 0
    for i in points:
        x = i[0]
        y = i[1]
        da_sum = da_sum + 2 * (a * x + b - y) * x
        db_sum = db_sum + 2 * (a * x + b - y)

    num = len(points)
    da = da_sum / float(num)
    db = db_sum / float(num)

    # 返回新的a,b
    return a - learn_rate * da, b - learn_rate * db


# totalnum示意总共迭代次数
def loop(a, b, learn_rate, points, totalnum):
    for i in range(0, totalnum):
        # 每次迭代都市获得一组新的a,b,将其作为下一次迭代的初始值
        a, b = step_grad(a, b, learn_rate, points)

    loss = get_loss(a, b, points)
    print("after ", totalnum, "times, loss: ", loss)
    print("a=", a, " b=", b)


if __name__ == '__main__':
    points = np.genfromtxt("data.csv", delimiter=",")

    # a,b初始化为0,learn_rate设置为0.0001,迭代10000次,points明白为实际情形中,采集到的数据
    loop(0, 0, 0.0001, points, 10000)

csv数据,网盘链接: https://pan.baidu.com/s/1Sknt8dV7kA81IE2ij6bkYw 提取码: exf2

训练效果:

,

菲律宾申慱手机登录网址

欢迎进入菲律宾申慱手机登录网址!Sunbet 申博提供申博开户(sunbet开户)、SunbetAPP下载、Sunbet客户端下载、Sunbet代理合作等业务。

发布评论

分享到:

双鸭山论坛:极限挑战总导演为罗志祥庆生 到底是什么关系?
1 条回复
  1. 皇冠代理APP下载
    皇冠代理APP下载
    (2020-04-23 00:51:55) 1#

    皇冠会员APP皇冠体育APP是一个开放皇冠代理APP下载、皇冠会员APP下载、皇冠线路APP下载、皇冠登录APP下载的平台,皇冠体育APP上最新登录线路、新2皇冠网址更新最快,皇冠体育APP开放皇冠会员注册、皇冠代理开户等业务。反复看不腻

发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。