| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 【MindSpore】【深度学习Step by Step】(1-1)线性神经网络 -> 正文阅读 |
|
[人工智能]【MindSpore】【深度学习Step by Step】(1-1)线性神经网络 |
深度学习Step by Step写在前面本教程是有关深度学习的入门教程,基于一个国产的人工智能引擎,mindspore,主要参考了《深度学习》以及《动手学深度学习》,使用MindSpore实现了《动手学深度学习》中很多有用的练习,可以作为深度学习以及MindSpore的入门教程。 阅读本教程需要有一定的Python基础。 你可以访问这个连接进行下载MindSpore:https://www.mindspore.cn/install。 所有代码可以在仓库中获取。 线性神经网络在历史上,神经网络有三次浪潮,其一是随着控制论的发展,奠定了神经网络的基本结构(感知机);第二次是联结主义的发展,使用了反向传播;深度学习则是近十几年发展而来,主要的代表有卷积神经网络等。 下面通过numpy来实现线性回归,以介绍深度学习的基本知识。 产生数据假设有一个线性生成器,以下式产生数值,其实W与B是未知的矩阵,N是高斯分布的噪声 Y = W X T + B + N Y = W X^T + B + N Y=WXT+B+N 我们通过下面这个程序来生成n个数据,并添加均值为0,方差为0.01的噪声。
线性网络我们要通过数据来估计出W与B的取值,使用线性网络 y ^ = w ^ x T + b ^ \hat y = \hat w x^T + \hat b y^?=w^xT+b^ 可以通过下面这个式子来实现
损失函数我们需要评估我们与目标函数之间的误差,并称这个函数为损失函数。在这里,我们采用平方误差(也叫L2损失)来衡量我们的预测函数与目标函数之间的差距。注意到我们对目标函数的 X X X与 B B B都是未知的,所以我们只能在给定 X X X的条件下,确定预测函数输出的 y ^ \hat y y^?与目标函数输出的真实 y y y之间的差距,即 L o s s ( y , y ^ ) = ( y ^ ? y ) 2 2 Loss(y, \hat y) = \frac{(\hat y - y)^2}2 Loss(y,y^?)=2(y^??y)2? 上式需要除二是因为求导后的表达式更简洁。我们通过下面的程序实现:
批量计算我们通过来打乱数据,提高计算速度。 以下是实现的代码,首先,我们要产生一组索引,通过
优化器梯度我们初始化设置的 W W W是高斯分布的, B B B为0,可以想到,当我们输入一个 X X X,此时线性网络的输出结果 y ^ \hat y y^?与真实值之间存在有较大的差距,所以我们需要通过某种方法来更新 W W W与 B B B。 作为线性函数时,我们很容易想到使用最小二乘法来计算最佳的 W W W与 B B B,但最小二乘法并不是什么时候都能够使用的。在深度学习中,我们由远及近,通过计算梯度的方式,来更新网络的参数。 什么是梯度呢?用一个简单的例子,比如有个函数, y = 1 2 x 2 y=\frac 1 2 x^2 y=21?x2,我们要寻找x值的最小值,虽然从数学上我们能很容易地知道该函数的最小值是0,但假设我们现在还不知道,如何寻找该函数的最小值呢?根据微积分,加入我们有一个点 x 0 x_0 x0?,我们将其带入函数中求导,得到 y ′ = x 0 y'=x_0 y′=x0?,如果 x 0 > 0 x_0>0 x0?>0,则 y ′ > 0 y'>0 y′>0,此时往 y ′ y' y′减小的方向(即 ? y ′ -y' ?y′方向)更新 x 0 x_0 x0?,就有希望达到极小值;如果 x 0 < 0 x_0<0 x0?<0,则 y ′ < 0 y'<0 y′<0,此时往 y ′ y' y′增大的方向(即 ? y ′ -y' ?y′方向)更新 x 0 x_0 x0?,就有希望达到极小值。从上面的例子看出,不管如何,往导数方向相反的方向,就有可能找到函数的极小值。 梯度,则是一元函数导数的推广,即对多元函数来说,梯度方向是函数值增长的方向;而梯度的反方向,有可能能够找到函数的极小值。 链式法则对多元函数来说,可以链式法则进行求导。 反向传播我们将由数据 x x x得到 y ^ \hat y y^?的过程,称为正向传播,此时我们可以计算出梯度。根据得到的梯度,反向更新网络的参数,该过程被称为反向传播。 随机梯度下降(SGD)我们要使 y ^ → y \hat y \to y y^?→y,等价于使损失函数最小化,也就是对损失函数求 W W W与 B B B的梯度,来更新 W W W与 B B B的权重。 所以,我们根据以下式子来更新线性函数的 W W W与 B B B w ^ ? l r ? ? L o s s ? w ^ → w ^ \hat w - lr * \frac{\partial Loss}{\partial \hat w} \to \hat w w^?lr??w^?Loss?→w^ b ^ ? l r ? ? L o s s ? b ^ → b ^ \hat b - lr * \frac{\partial Loss}{\partial \hat b} \to \hat b b^?lr??b^?Loss?→b^ 式中的 l r lr lr是学习率,目的是将梯度的大小进行缩放,避免以太大的范围更新权限。 首先我们来计算一下 W W W与 B B B的梯度,根据损失函数,将 y ^ \hat y y^?代入,有 L o s s ( y , x , b ) = ( w ^ × x + b ^ ? y ) 2 2 Loss(y, x, b) = \frac{(\hat w \times x + \hat b - y)^2}2 Loss(y,x,b)=2(w^×x+b^?y)2? 如果我们对他求导,可以得到以下两个式子 ? L o s s ? w ^ = ( w ^ × x + b ^ ? y ) × x = ( y ^ ? y ) × x \frac{\partial Loss}{\partial \hat w}= (\hat w \times x + \hat b - y)\times x = (\hat y - y)\times x ?w^?Loss?=(w^×x+b^?y)×x=(y^??y)×x ? L o s s ? b ^ = w ^ × x + b ^ ? y ) = ( y ^ ? y ) \frac{\partial Loss}{\partial \hat b} = \hat w \times x + \hat b - y) = (\hat y - y) ?b^?Loss?=w^×x+b^?y)=(y^??y) 我们通过下面的代码实现上述的过程。
原理上,我们要在所有的样本中计算出梯度再进行更新,但现在我们只计算了一个batch size样本的梯度就对网络参数进行了更新,这个batch size样本的选择具有一定的随机性,所以称为随机梯度下降。 程序逻辑首先,我们设置真实的分布
然后,生成1000个样本数据
设置批量为10,学习率0.03,训练三轮,
以均值为0,方差为0.01设置需要训练的w,以0设置b。
设置网络为线性网络,损失函数为平方差函数。
最后一步,输入数据,获取梯度,更新 w w w, b b b的值,计算损失函数。
最后我们可以得到估计的 w w w与 b b b。
实现结果以下是程序的输出结果
(2022年10月15日更新) |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 20:14:11- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |