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

单个输入Demo

在这里插入图片描述

输入层

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

X = ( x 1 x 2 … x 200 ) X=\begin{pmatrix} x_1 & x_2 & \dots & x_{200} \end{pmatrix} X=(x1x2x200)   Y = ( y 1 y 2 … y 200 ) \ Y=\begin{pmatrix} y_1 & y_2 & \dots & y_{200} \end{pmatrix}  Y=(y1y2y200)

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

权重W/B

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

输出层

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

读取文件数据

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

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

样本Id1234(更多样本向右扩展)
特征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 Path

x_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) + b
    return 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=2m1i=1m(ziyi)2

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

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

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

反向传播

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

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

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

梯度更新

def UpdateWeights(w, b, dW, dB, eta):
    w = w - eta*dW
    b = b - eta*dB
    return 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 data
    plt.plot(X, Y, "b.")
    # draw predication data
    PX = np.linspace(0,1,10)
    PZ = w*PX + b
    plt.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 rate
    eta = 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 data
    X, Y = ReadData()
    # count of samples
    num_example = X.shape[1]

    for i in range(num_example):
        # get x and y value for one sample
        x,y = GetSample(X,Y,i)
        # get z from x,y
        z = ForwardCalculation(w, b, x)
        # calculate gradient of w and b
        dW, dB = BackPropagation(x, y, z)
        # update w,b
        w, 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列的矩阵。

输入层

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

样本序号1231000
朝向(东南西北)2233
地理位置(几环)4633
居住面积(平米)7911610998
整套价格(万元)469631323576

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

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= (X1X2X1000)=(x1,1x2,1x1000,1 x1,2x2,2x1000,2 x1,3x2,3x1000,3)=(2233 4633 7911610998)

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=(y1y2ym )=(469631323576 )

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=WX+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 (w1w2w3)(x1  x2  x3)=w1x1+w2x2+w3x3

假设每个样本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} (w1w2wn)

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的值也在不断变大,说明网络发散了。

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

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

样本序号123200
服务器数量(千)0.9280.04690.8550.373
空调功率(千瓦)4.8242.9504.6433.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 W1X1+W2X2这个式子中,如果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ˉ=n1inxi(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=n11in(xixˉ)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=n11in(xixˉ)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)=n11in[(xixˉ)(yiyˉ)](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=xmaxxminxxmin(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=xmaxxminxxˉ(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=(xxˉ)std(8)

中心化

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

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

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

方法W1W2W3B预测结果
正规方程2-105110529万元
神经网络5.99-40.00394.99292.0036838万元

样本数据:

特征朝向位置面积
最小值1240
最大值46119
待预测房子参数2593

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

结果W1W2W3B
正规方程2-105110
神经网络5.99-40.00394.99292.00
倍差5.99/2=3-40/-10=4394.99/5=79292/110=2.65

归一化前后的数据

特征朝向位置面积
最小值1240
最大值46119
范围4-1=36-2=4119-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=WX+B(Y) (Z是预测值) Z = W ′ ⋅ X ′ + B ′ Z = W' \cdot X' +B' \tag{Z是预测值} Z=WX+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} WX+B=WX+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=XmaxXminXXmin(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' WX+B=WXmaxXminXXmin+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' =WXmaxXminXWXmaxXminXmin+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' =XrangeWXXrangeWXmin+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} WX+B=XrangeWXXrangeWXmin+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} WX=XrangeWX(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=XrangeWXmin+B(5) 从公式4,两边除以X,可以得到: (6) W = W ′ X r a n g e W = {W' \over X_{range}} \tag{6} W=XrangeW(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=X1rangeW1=(41)5.992 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=X2rangeW2=(62)4010 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=X3rangeW3=(11940)394.995 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=BX1rangeW1X1minX2rangeW2X2minX3rangeW3X3min = 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} =292415.99×16240×211940394.99×40 = 292 − 2 + 20 − 200 = 110 = 292-2+20-200=110 =2922+20200=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

  • 8
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值