单个输入Demo

输入层

它在输入层只接受一个输入,经过参数w,b的计算后,直接输出结果。这样一个简单的“网络”,只能解决简单的一元线性回归问题,而且由于是线性的,我们不需要定义激活函数,这就大大简化了程序,而且便于大家循序渐进地理解各种知识点。下面,我们在这个最简的线性回归的例子中,来说明神经网络中最重要的反向传播和梯度下降的概念和过程以及编码实现。

X = ( x 1 x 2 … x 200 ) X=\begin{pmatrix} x_1 & x_2 & \dots & x_{200} \end{pmatrix} X=(x1​​x2​​…​x200​​) Y = ( y 1 y 2 … y 200 ) \ Y=\begin{pmatrix} y_1 & y_2 & \dots & y_{200} \end{pmatrix}  Y=(y1​​y2​​…​y200​​)

其中,x就是上图中红色点的横坐标值(服务器数),y是纵坐标值(空调功率)。

权重W/B

因为是一元线性问题,所以W/B都是一个标量,记为w和b,我们认为这组数据有这个关系: y = w ⋅ x + b y = w \cdot x+b y=w⋅x+b

输出层

输出层1个神经元,是上述预测公式的直接输出,但定义上有所变化,应该是 z = w ⋅ x + b z = w \cdot x+b z=w⋅x+b,z是我们的预测输出,y是实际的样本标签值。

读取文件数据

注意:从本章开始,所有的样本数据的格式都是:每一列是一个样本的所有特征,每一行是某个特征的所有样本。

比如,如果有一个4个样本的数据集,每个样本有两个特征,其数据结构是这样的: 最终,样本数据的样子是:

样本Id 1 2 3 4 (更多样本向右扩展)
特征1 x 1 , 1 x_{1,1} x1,1​ x 2 , 1 x_{2,1} x2,1​ x 3 , 1 x_{3,1} x3,1​ x 4 , 1 x_{4,1} x4,1​
特征2 x 1 , 2 x_{1,2} x1,2​ x 2 , 2 x_{2,2} x2,2​ x 3 , 2 x_{3,2} x3,2​ x 4 , 2 x_{4,2} x4,2​
(更多特征向下扩展)

对于标签数据Y,一般只有一个标签值,所以是个(1,m)的二维矩阵,与X对应的。

import numpy as np
import matplotlib.pyplot as plt
from pathlib import Pathx_data_name = "X04.dat"
y_data_name = "Y04.dat"def ReadData():Xfile = Path(x_data_name)Yfile = Path(y_data_name)if Xfile.exists() & Yfile.exists():X = np.load(Xfile)Y = np.load(Yfile)# 注意这里和前面的例子不同return X.reshape(1,-1),Y.reshape(1,-1)else:return None,None

在上面的code里的reshape,实际上是把一个一维数组(m,)变成1行m列的二维数组(1,m)。这个例子中,X只有一个特征,所以只有一行。

前向计算

def ForwardCalculation(w,b,x):z = np.dot(w, x) + breturn z

关于Python的函数命名规范,一般是用aa_bb这种形式,而不是AaBb的形式,这是个人习惯而已,大家自己随意。而关于变量命名规范,我个人习惯用大写X表示一个矩阵,用小写x表示一个变量或一个样本。

损失函数

我们用传统的均方差函数,其中,z是每一次迭代的预测输出,y是样本标签数据。我们使用所有样本参与计算,因此损失函数实际为:

L o s s = 1 2 m ∑ i = 1 m ( z i − y i ) 2 Loss = \frac{1}{2m}\sum_{i=1}^{m}(z_i - y_i) ^ 2 Loss=2m1​i=1∑m​(zi​−yi​)2

其中的分母中有个2,实际上是想在求导数时把这个2约掉,没有什么原则上的区别。

为什么使用所有样本参与计算呢?因为单个样本或少量样本的损失并不能代表广大人民群众的利益。一条直线可能正好穿过一个点,那么对于这个点来说,它的误差为0,但对于其它样本来说,误差就可能很大。

我们暂时不需要实现这个损失函数,只是用来定义梯度下降时的求导过程。

反向传播

下面的代码是通过梯度下降法中的公式推导而得的。

def BackPropagation(x,y,z):dZ = z - ydB = dZdW = np.dot(dZ, x)return dW, dB

dZ是中间变量,避免重复计算。dZ又可以写成delta_Z,是某一层神经网络的反向误差输入。

梯度更新

def UpdateWeights(w, b, dW, dB, eta):w = w - eta*dWb = b - eta*dBreturn w,b

推理

def Inference(w,b,x):z = ForwardCalculation(w,b,x)return z

推理过程,实际上就是一个前向计算过程,我们把它单独拿出来,方便对外接口的设计。

获得指定的一个训练样本

def GetSample(X,Y,i):x = X[0,i]y = Y[0,i]return x,y

结果显示函数

def ShowResult(X, Y, w, b, iteration):# draw sample dataplt.plot(X, Y, "b.")# draw predication dataPX = np.linspace(0,1,10)PZ = w*PX + bplt.plot(PX, PZ, "r")plt.title("Air Conditioner Power")plt.xlabel("Number of Servers(K)")plt.ylabel("Power of Air Conditioner(KW)")plt.show()print(iteration)print(w,b)

对于初学神经网络的人来说,可视化的训练过程及结果,可以极大地帮助理解神经网络的原理。

主程序

if __name__ == '__main__':# learning rateeta = 0.1# set w,b=0, you can set to others values to have a try#w, b = np.random.random(),np.random.random()w, b = 0, 0# create mock up dataX, Y = ReadData()# count of samplesnum_example = X.shape[1]for i in range(num_example):# get x and y value for one samplex,y = GetSample(X,Y,i)# get z from x,yz = ForwardCalculation(w, b, x)# calculate gradient of w and bdW, dB = BackPropagation(x, y, z)# update w,bw, b = UpdateWeights(w, b, dW, dB, eta)ShowResult(X, Y, w, b, 1)result = Inference(w,b,0.346)print("result=", result)

运行结果

epoch=1,iteration=200,w=1.918221,b=3.077801
result= 3.741505043252122

最终我们得到了W=1.918,B=3.077,然后根据这两个值画出了上图中的红线:

y = 1.918 x + 3.077 y=1.918x+3.077 y=1.918x+3.077

预测时,已知有346台服务器,先要除以1000,因为横坐标是以K(千台)服务器为单位的,代入前向计算函数,得到的结果是3.74千瓦。

多个输入Demo

我们定义一个一层的神经网络,输入层为3或者更多,反正大于2了就没区别。这个一层的神经网络没有中间层,只有输入项和输出层(输入项不算做一层),而且只有一个神经元,并且神经元有一个线性输出,不经过激活函数处理。亦即在下图中,经过 Σ \Sigma Σ求和得到Z值之后,直接把Z值输出。

矩阵运算过程: W ( 1 , 3 ) ∗ X ( 3 , 1 ) + B ( 1 , 1 ) = > Z ( 1 , 1 ) W(1,3) * X(3,1) + B(1,1) => Z(1,1) W(1,3)∗X(3,1)+B(1,1)=>Z(1,1)
上述公式中括号中的数字表示该矩阵的 (行,列) 数,如W(1,3)表示W是一个1行3列的矩阵。

输入层

我们先看一下样本数据的样子:

样本序号 1 2 3 1000
朝向(东南西北) 2 2 3 3
地理位置(几环) 4 6 3 3
居住面积(平米) 79 116 109 98
整套价格(万元) 469 631 323 576

单独看一个样本是这样的:

x 1 = ( x 1 , 1 x 1 , 2 x 1 , 3 ) = ( 1 3 96 ) x_1 = \begin{pmatrix} x_{1,1} \ x_{1,2} \ x_{1,3} \end{pmatrix} = \begin{pmatrix} 1 \ 3 \ 96 \end{pmatrix} x1​=(x1,1​ x1,2​ x1,3​​)=(1 3 96​)

y 1 = ( 434 ) y_1 = \begin{pmatrix} 434 \end{pmatrix} y1​=(434​)

一共有1000个样本,每个样本3个特征值,X就是一个 3 × 1000 3 \times 1000 3×1000的矩阵,模样是酱紫的:

X = ( X 1 X 2 … X 1000 ) = ( x 1 , 1 x 2 , 1 … x 1000 , 1 x 1 , 2 x 2 , 2 … x 1000 , 2 x 1 , 3 x 2 , 3 … x 1000 , 3 ) = ( 2 2 3 … 3 4 6 3 … 3 79 116 109 … 98 ) X = \ \begin{pmatrix} X_1 & X_2 \dots X_{1000} \end{pmatrix} = \begin{pmatrix} x_{1,1} & x_{2,1} & \dots & x_{1000,1} \ x_{1,2} & x_{2,2} & \dots & x_{1000,2} \ x_{1,3} & x_{2,3} & \dots & x_{1000,3} \end{pmatrix} = \begin{pmatrix} 2 & 2 & 3 & \dots & 3 \ 4 & 6 & 3 & \dots & 3 \ 79 & 116 & 109 & \dots & 98 \end{pmatrix} X= (X1​​X2​…X1000​​)=(x1,1​​x2,1​​…​x1000,1​ x1,2​​x2,2​​…​x1000,2​ x1,3​​x2,3​​…​x1000,3​​)=(2​2​3​…​3 4​6​3​…​3 79​116​109​…​98​)

Y = ( y 1 y 2 … y m ) = ( 469 631 323 … 576 ) Y = \begin{pmatrix} y_1 & y_2 & \dots & y_m \ \end{pmatrix}= \begin{pmatrix} 469 & 631 & 323 & \dots & 576 \ \end{pmatrix} Y=(y1​​y2​​…​ym​ ​)=(469​631​323​…​576 ​)

X 1 X_1 X1​表示第一个样本, x 1 , 1 x_{1,1} x1,1​表示第一个样本的一个特征值, y 1 y_1 y1​是第一个样本的标签值。

权重W和B

木头:老师,为何不把这个表格转一下,变成横向是样本特征值,纵向是样本数量?那样好像更符合思维习惯?

铁柱:确实是!但是在实际的矩阵运算时,由于是 Z = W ⋅ X + B Z=W \cdot X+B Z=W⋅X+B,W在前面,X在后面,所以必须是这个样子的:

( w 1 w 2 w 3 ) ( x 1 x 2 x 3 ) = w 1 ⋅ x 1 + w 2 ⋅ x 2 + w 3 ⋅ x 3 \begin{pmatrix} w_1 & w_2 & w_3 \end{pmatrix} \begin{pmatrix} x_1 \ \ x_2 \ \ x_3 \end{pmatrix}= w_1 \cdot x_1+w_2 \cdot x_2+w_3 \cdot x_3 (w1​​w2​​w3​​)(x1​  x2​  x3​​)=w1​⋅x1​+w2​⋅x2​+w3​⋅x3​

假设每个样本x有n个特征向量,上式中的W就是一个 1 × n 1 \times n 1×n的向量,让每个w都对应一个x: ( w 1 w 2 … w n ) \begin{pmatrix}w_1 & w_2 \dots w_n\end{pmatrix} (w1​​w2​…wn​​)

B是个单值,因为只有一个神经元,所以只有一个bias,每个神经元对应一个bias,如果有多个神经元,它们都会有各自的b值。

输出层

由于我们只想完成一个回归(拟合)任务,所以输出层只有一个神经元。由于是线性的,所以没有用激活函数。

对于拟合,可以想象成用一支笔在一堆点中画一条直线或者曲线,而那一个神经元就是这支笔。如果有多个神经元,可以画出多条线来,就不是拟合了,而是分类。

运行

怀着期待的心情用颤抖的右手按下了运行键…but…what happened?

epoch=0
0 0 55883834476.133575 [[ 101.0507623   201.66401831 3960.19459875]] [[50.13519931]]
0 1 2.075927906874647e+16 [[  -61796.96353768  -123594.36458166 -2410062.36310063]] [[-30898.87195068]]
0 2 3.7752686053459638e+22 [[5.60309885e+07 1.68154762e+08 3.25097149e+09]] [[28015493.83866825]]
0 3 5.332628913256499e+28 [[-1.06460908e+11 -1.06348785e+11 -3.86686449e+12]] [[-3.5477631e+10]]
......
0 110 inf [[5.83856788e+303 1.17197663e+304 3.22400448e+305]] [[5.86699589e+303]]
0 111 inf [[-1.00706180e+307 -1.00647368e+307 -inf]] [[-3.35295186e+306]]
0 112 nan [[inf inf nan]] [[inf]]
0 113 nan [[nan nan nan]] [[nan]]
0 114 nan [[nan nan nan]] [[nan]]
......

怎么会overflow呢?于是右手的颤抖没有停止,左手也开始颤抖了。

数值太大,导致计算溢出了。第一次遇到这个情况,但相信不会是最后一次,因为这种情况在神经网络中太常见了。我们再看看损失函数历史记录:

损失函数值随着迭代次数快速上升,说明训练没有收敛,而是发散了。

解决训练不收敛问题

仔细分析一下屏幕打印信息:

0 0 48904435754.68428 [[  93.8  187.6 3705.1]] [[46.9]]
0 1 1.8166533368107932e+16 [[  -57809.94  -115619.88 -2254540.76]] [[-28904.97]]

前两次迭代的损失值已经是天文数字了,后面的W和B的值也在不断变大,说明网络发散了。

难度我们遇到了传说中的梯度爆炸!数值太大,导致计算溢出了。第一次遇到这个情况,但相信不会是最后一次,因为这种情况在神经网络中太常见了。别慌,擦干净头上的冷汗,踩着自己的尸体继续前行!

回想一个问题:为什么在前几章中,我们没有遇到这种情况?把样本拿来看一看:

样本序号 1 2 3 200
服务器数量(千) 0.928 0.0469 0.855 0.373
空调功率(千瓦) 4.824 2.950 4.643 3.594

因为所有的X值(服务器数量)都是在[0,1]之间的,而本次的数据有三个特征值,全都是不是在[0,1]之间的,并且取值范围还不相同。我们不妨把本次样本数据也做一下这样的处理,亦即“归一化”。

其实,数据归一化是深度学习的必要步骤之一,已经是魔法师们家喻户晓的技能,也因此它很少被各种博客/文章所提及,以至于麻瓜们经常被坑。

为什么要做归一化

理论层面上,神经网络是以样本在事件中的统计分布概率为基础进行训练和预测的,也就是说:

  1. 样本的各个特征的取值要符合概率分布,即[0,1]
  2. 样本的度量单位要相同。我们并没有办法去比较1米和1公斤的区别,但是,如果我们知道了1米在整个样本中的大小比例,以及1公斤在整个样本中的大小比例,比如一个处于0.2的比例位置,另一个处于0.3的比例位置,就可以说这个样本的1米比1公斤要小!
  3. 神经网络假设所有的输入输出数据都是标准差为1,均值为0,包括权重值的初始化,激活函数的选择,以及优化算法的的设计。
  4. 数值问题:归一化/标准化可以避免一些不必要的数值问题。因为sigmoid/tanh的非线性区间大约在**[-1.7,1.7]**。意味着要使神经元有效,tanh( w1x1 + w2x2 +b) 里的 w1x1 +w2x2 +b 数量级应该在 1 (1.7所在的数量级)左右。这时输入较大,就意味着权值必须较小,一个较大,一个较小,两者相乘,就引起数值问题了。
  5. 初始化:在初始化时我们希望每个神经元初始化成有效的状态,tansig函数在[-1.7, 1.7]范围内有较好的非线性,所以我们希望函数的输入和神经元的初始化都能在合理的范围内使得每个神经元在初始时是有效的。(如果权值初始化在[-1,1]且输入没有归一化且过大,会使得神经元饱和)
  6. 梯度:以输入-隐层-输出这样的三层BP为例,我们知道对于输入-隐层权值的梯度有2ew(1-a^2)*x的形式(e是误差,w是隐层到输出层的权重,a是隐层神经元的值,x是输入),若果输出层的数量级很大,会引起e的数量级很大,同理,w为了将隐层(数量级为1)映身到输出层,w也会很大,再加上x也很大的话,从梯度公式可以看出,三者相乘,梯度就非常大了。这时会给梯度的更新带来数值问题。
  7. 学习率:知道梯度非常大,学习率就必须非常小,因此,学习率(学习率初始值)的选择需要参考输入的范围,不如直接将数据归一化,这样学习率就不必再根据数据范围作调整。 对w1适合的学习率,可能相对于w2来说会太小,若果使用适合w1的学习率,会导致在w2方向上步进非常慢,会消耗非常多的时间,而使用适合w2的学习率,对w1来说又太大,搜索不到适合w1的解。如果使用固定学习率,而数据没归一化,则后果可想而知。

回到房价数据问题

房价数据中,地理位置的取值范围是[2,6],而房屋面积的取值范围为[40,120],二者相差太远,就不可以放在一起计算了。
在 W 1 X 1 + W 2 X 2 W_1X_1+W_2X_2 W1​X1​+W2​X2​这个式子中,如果X1的取值是[2,6],X2的取值是[40,120],相差太远,而且都不在[0,1]之间,所以对于神经网络来说很难理解。下图展示了归一化前后的情况Loss值的等高图,意思是地理位置和房屋面积取不同的值时,作为组合来计算损失函数值时,形成的类似地图的等高图。左侧为归一化前,右侧为归一化后

房屋面积的取值范围是[40,120],而地理位置的取值范围是[2,6],二者会形成一个很扁的椭圆,如左侧。这样在寻找最优解的时候,过程会非常曲折。运气不好的话,如同我们上面的代码,根本就没法训练。

几个基本数学概念

  • 均值mean:

(1) x ˉ = 1 n ∑ i n x i \bar{x}=\frac{1}{n}\sum_i^nx_i \tag{1} xˉ=n1​i∑n​xi​(1)

  • 标准差stdandard deviation:

(2) s t d = 1 n − 1 ∑ i n ( x i − x ˉ ) 2 std=\sqrt{\frac{1}{n-1} \sum_i^n{(x_i-\bar{x})^2}} \tag{2} std=n−11​i∑n​(xi​−xˉ)2 ​(2)

  • 方差variance

(3) v a r = 1 n − 1 ∑ i n ( x i − x ˉ ) 2 = s 2 var=\frac{1}{n-1} \sum_i^n{(x_i-\bar{x})^2}=s^2 \tag{3} var=n−11​i∑n​(xi​−xˉ)2=s2(3)

  • 协方差covariance

(4) c o v ( X , Y ) = 1 n − 1 ∑ i n [ ( x i − x ˉ ) ( y i − y ˉ ) ] cov(X,Y)=\frac{1}{n-1} \sum_i^n{[(x_i-\bar{x})(y_i-\bar{y})]} \tag{4} cov(X,Y)=n−11​i∑n​[(xi​−xˉ)(yi​−yˉ​)](4)
结果为正,表示X,Y是正相关。

归一化

把数据线性地变成[0,1]或[-1,1]之间的小数,把带单位的数据(比如米,公斤)变成无量纲的数据,区间缩放。

归一化有三种方法:

  • Min-Max归一化: (5) x n e w = x − x m i n x m a x − x m i n x_{new}={x-x_{min} \over x_{max} - x_{min}} \tag{5} xnew​=xmax​−xmin​x−xmin​​(5)
  • 平均值归一化: (6) x n e w = x − x ˉ x m a x − x m i n x_{new} = {x - \bar{x} \over x_{max} - x_{min}} \tag{6} xnew​=xmax​−xmin​x−xˉ​(6)
  • 非线性归一化: (7) 对 数 转 换 y = l o g ( x ) , 反 余 切 转 换 y = a t a n ( x ) ⋅ 2 / π 对数转换y=log(x),反余切转换y=atan(x) \cdot 2/π \tag{7} 对数转换y=log(x),反余切转换y=atan(x)⋅2/π(7)

标准化

把每个特征值中的所有数据,变成平均值为0,标准差为1的数据,最后为正态分布。

Z-score规范化(标准差标准化 / 零均值标准化,其中std是标准差): (8) x n e w = ( x − x ˉ ) / s t d x_{new} = (x - \bar{x})/std \tag{8} xnew​=(x−xˉ)/std(8)

中心化

平均值为0,无标准差要求: (9) x n e w = x − x ˉ x_{new} = x - \bar{x} \tag{9} xnew​=x−xˉ(9)

再次返回房价问题,归一化后的损失


损失虽然收敛,但是和预期相差甚远
正规方程的解是:w1=2.000000,w2=-10.000000,w3=5.000000,b=110.000000
神经网络的解是:
w= [[ 5.99981695 -40.00019134 394.99950271]] b= [[292.00048552]]
差距有点大,如下表:

方法 W1 W2 W3 B 预测结果
正规方程 2 -10 5 110 529万元
神经网络 5.99 -40.00 394.99 292.00 36838万元

样本数据:

特征 朝向 位置 面积
最小值 1 2 40
最大值 4 6 119
待预测房子参数 2 5 93

计算一下W的变化率,再和特征缩放值去比较

结果 W1 W2 W3 B
正规方程 2 -10 5 110
神经网络 5.99 -40.00 394.99 292.00
倍差 5.99/2=3 -40/-10=4 394.99/5=79 292/110=2.65

归一化前后的数据

特征 朝向 位置 面积
最小值 1 2 40
最大值 4 6 119
范围 4-1=3 6-2=4 119-40=79

发现:通过对比发现,第一张表最后一行的数据,和第二张表最后一行的数据,有惊人的相似之处

还原真实的W,B值

唯一修改的地方,就是样本数据特征值的归一化,我们并没有修改标签值!,所以必须将权重和偏置还原到未归一化之前。
假设在归一化之前,真实的样本值是 X X X,真实的权重值是 W W W;在归一化之后,样本值变成了 X ′ X' X′,训练出来的权重值是 W ′ W' W′:
(Y是标签值) Y = W ⋅ X + B Y = W \cdot X +B \tag{Y是标签值} Y=W⋅X+B(Y是标签值) (Z是预测值) Z = W ′ ⋅ X ′ + B ′ Z = W' \cdot X' +B' \tag{Z是预测值} Z=W′⋅X′+B′(Z是预测值)
由于训练时标签值(房价)并没有做归一化,意味着我们是用真实的房价做的训练,所以预测值和标签值应该相等,所以: Y = = Z Y == Z Y==Z (1) W ⋅ X + B = W ′ ⋅ X ′ + B ′ W \cdot X +B = W' \cdot X'+B' \tag{1} W⋅X+B=W′⋅X′+B′(1)

归一化的公式是: (2) X ′ = X − X m i n X m a x − X m i n X' = {X - X_{min} \over X_{max}-X_{min}} \tag{2} X′=Xmax​−Xmin​X−Xmin​​(2)
把公式2代入公式1:
W ⋅ X + B = W ′ ⋅ X − X m i n X m a x − X m i n + B ′ W \cdot X +B = W' \cdot {X - X_{min} \over X_{max}-X_{min}} + B' W⋅X+B=W′⋅Xmax​−Xmin​X−Xmin​​+B′ = W ′ ⋅ X X m a x − X m i n − W ′ ⋅ X m i n X m a x − X m i n + B ′ =W' \cdot {X \over X_{max}-X_{min}} - W' \cdot {X_{min} \over X_{max}-X_{min}} + B' =W′⋅Xmax​−Xmin​X​−W′⋅Xmax​−Xmin​Xmin​​+B′ = W ′ X X r a n g e − W ′ X m i n X r a n g e + B ′ ={W'X \over X_{range}} - {W'X_{min} \over X_{range}}+B' =Xrange​W′X​−Xrange​W′Xmin​​+B′ 第二项是个常数,即: (3) W ⋅ X + B = W ′ X r a n g e ⋅ X − W ′ X m i n X r a n g e + B ′ W \cdot X +B = {W' \over X_{range}} \cdot X - {W'X_{min} \over X_{range}} + B' \tag{3} W⋅X+B=Xrange​W′​⋅X−Xrange​W′Xmin​​+B′(3) 如果想让公式3等式成立,则变量项和常数项分别相等,即: (4) W ⋅ X = W ′ X r a n g e ⋅ X W \cdot X = {W' \over X_{range}} \cdot X \tag{4} W⋅X=Xrange​W′​⋅X(4) (5) B = − W ′ X m i n X r a n g e + B ′ B = - {W'X_{min} \over X_{range}} + B' \tag{5} B=−Xrange​W′Xmin​​+B′(5) 从公式4,两边除以X,可以得到: (6) W = W ′ X r a n g e W = {W' \over X_{range}} \tag{6} W=Xrange​W′​(6)

W 1 = W 1 ′ X 1 r a n g e = 5.99 ( 4 − 1 ) ≈ 2 W1 = {W1' \over X1_{range}} = {5.99 \over (4-1)} \approx 2 W1=X1range​W1′​=(4−1)5.99​≈2 W 2 = W 2 ′ X 2 r a n g e = − 40 ( 6 − 2 ) ≈ − 10 W2 = {W2' \over X2_{range}} = {-40 \over (6-2)} \approx -10 W2=X2range​W2′​=(6−2)−40​≈−10 W 3 = W 3 ′ X 3 r a n g e = 394.99 ( 119 − 40 ) ≈ 5 W3 = {W3' \over X3_{range}} = {394.99 \over (119-40)} \approx 5 W3=X3range​W3′​=(119−40)394.99​≈5 B = B ′ − W 1 ′ X 1 m i n X 1 r a n g e − W 2 ′ X 2 m i n X 2 r a n g e − W 3 ′ X 3 m i n X 3 r a n g e B = B' - {W1'X1_{min} \over X1_{range}} - {W2'X2_{min} \over X2_{range}} - {W3'X3_{min} \over X3_{range}} B=B′−X1range​W1′X1min​​−X2range​W2′X2min​​−X3range​W3′X3min​​ = 292 − 5.99 × 1 4 − 1 − − 40 × 2 6 − 2 − 394.99 × 40 119 − 40 = 292 - {5.99 \times 1 \over 4-1}-{-40 \times 2 \over 6-2}-{394.99 \times 40 \over 119-40} =292−4−15.99×1​−6−2−40×2​−119−40394.99×40​ = 292 − 2 + 20 − 200 = 110 = 292-2+20-200=110 =292−2+20−200=110

正确预测方法(不需要还原到正规方程需要的权重和偏置)

在线性问题中,还能够还原W和B的值,
在非线性问题中或者深层网络,可能根本做不到这一点。
所以,可以把需要预测的数据,也先做归一化,然后用训练出来的W/B的值来计算,得到预测结果。

https://github.com/microsoft/ai-edu/blob/master/B-教学案例与实践/B6-神经网络基本原理简明教程/04.3-神经网络法.md
https://github.com/microsoft/ai-edu/blob/master/B-教学案例与实践/B6-神经网络基本原理简明教程/05.5-正确的推理方法.md

深度学习基础之-2.3简单的神经网络(单个输入/多个输入)做线性回归+特征值归一化相关推荐

  1. 深度学习(6)构造简单的神经网络

    目录 一.激励函数 二.创建数组(初始输入和输出) 三.更新权重 1.创建权重(w0和w1) 2.限值(-1~1) 3.正向传播 4.反向传播 4-1.求l2差错 4-2.求l1差错 五.更新权重 总 ...

  2. 深度学习基础知识(八):神经网络基础之导数

    这个专栏主要是想和大家分享一下深度学习的基础知识,主要是以吴恩达老师深度学习课程内容作为基础,并补充了很多其他内容希望让整体内容更加容易理解和系统化.如果想要了解具体专栏里面有什么内容的话,可以看一看 ...

  3. 深度学习基础(五):循环神经网络概念、结构及原理实现

    本文的概念和结构部分摘自循环神经网络惊人的有效性 循环神经网络 序列 普通神经网络和卷积神经网络的一个显而易见的局限就是他们的API都过于限制:他们接收一个固定尺寸的向量作为输入(比如一张图像),并且 ...

  4. 《目标检测蓝皮书》第2篇 深度学习基础

    本专栏将系统性地讲解计算机视觉基础知识.包含第1篇机器学习基础.第2篇深度学习基础.第3篇卷积神经网络.第4篇经典热门网络结构.第5篇目标检测基础.第6篇网络搭建及训练.第7篇模型优化方法及思路.第8 ...

  5. 深度估计相关原理(计算机视觉和深度学习基础)

    今天来和大家介绍一下深度估计涉及到的理论知识点,包括计算机视觉基础和深度学习基础. 一.计算机视觉基础 1.1. 针孔相机模型 相机模型,是指采用一个几何模型来描述三维世界中的坐标点映射到二维图像平面 ...

  6. 深度学习基础(基本概念、优化算法、初始化、正则化等)

    2020-04-25 16:29:09 引言 深度学习目前已成为发展最快.最令人兴奋的机器学习领域之一,许多卓有建树的论文已经发表,而且已有很多高质量的开源深度学习框架可供使用.然而,论文通常非常简明 ...

  7. 【完结】有三AI阿里云的深度学习基础课程暂时完结,欢迎扩散学习

    2021年3月份有三AI与阿里天池联合推出了深度学习系列课程, 课程内容包括人工智能与深度学习发展背景,深度学习典型应用,卷积神经网络,循环神经网络,生成对抗网络,深度学习开源框架等内容,目前已经基本 ...

  8. 人工智能 - paddlepaddle飞桨 - 深度学习基础教程 - 编程指南

    编程指南 目前飞桨(PaddlePaddle,以下简称Paddle)已经同时支持动态图和静态图两种编程方式, 本文主要侧重于介绍静态图的编程方法,关于动态图编程方法,请参考动态图机制-DyGraph. ...

  9. 人工智能 - paddlepaddle飞桨 - 深度学习基础教程 - 个性化推荐

    人工智能 - paddlepaddle飞桨 - 深度学习基础教程 - 个性化推荐 本教程源代码目录在book/recommender_system,初次使用请您参考Book文档使用说明. 说明: 硬件 ...

最新文章

  1. mybatis 使用resultMap实现数据库的操作
  2. HTML POST提交参数给PHP并返回json,上传execl文件
  3. 【BZOJ4405】【WC2016】挑战NPC(带花树)
  4. Android进程退出的方法
  5. flutter - dart基础之map
  6. php分享二十:mysql优化
  7. Panorama是什么意思
  8. fun php,fun.php
  9. 关于文件的MIME类型
  10. HTML如何设置四边形,css实现三角形和平形四边形
  11. RK356X系列(RK3568)GL857L芯片 USB驱动开发
  12. python爬取凤凰新闻网_python爬取凤凰网站的新闻,及其链接地址,来源,时间和内容,用selenium自动化和requests处理数据...
  13. sunday 算法python实现
  14. Matlab:绘制不同颜色的柱状图bar
  15. OpenAI亲谈:我们眼中的GPT-3、大规模语言模型的局限性与出路在哪
  16. MT4如何设置手机app通知
  17. hadoop中使用hprof工具进行性能分析
  18. 大众文艺杂志大众文艺杂志社大众文艺编辑部2022年第9期目录
  19. 家庭云/私有云搭建系列之网络篇——“我们该如何通过网络连接自己的私有云设备” IPv4篇
  20. 绘制炫酷逼真的三维地形图

热门文章

  1. 教你用Python画了一棵圣诞树
  2. layim之邀请好友加入群组
  3. 2022鲁大师评测沟通会开启汽车评测新赛道
  4. 竞逐新能源汽车续航,背靠广汽的巨湾技研能否打好“技术牌”?
  5. 互联网+时代的到来,让一站式婚庆管理系统成为潮流
  6. 计算机主机的跳线怎么接,手把手教你台式机电脑主板跳线接法
  7. 阿里云ECS安装MySql数据库
  8. 代码覆盖率在性能优化上的一种可行应用
  9. 1.点亮一个LED灯
  10. cf 723 C2. Potions (Hard Version)(反悔,priority)