深度学习(2)回归问题

一. 问题提出与解析

1. Machine Learning

  • make decisions
  • going left/right → \to discrete
  • increase/decrease → \to continuous

2. Continuous Prediction

在这里插入图片描述

  • f θ : x → y f_θ:x→y fθ:xy
  • x : i n p u t d a t a x:input data x:inputdata
  • f ( x ) : p r e d i c t i o n f(x):prediction f(x):prediction
  • y : r e a l d a t a , g r o u n d − t r u t h y:real data,ground-truth y:realdata,groundtruth

3. Linear Equation

  • y=w*x+b
  • 1.567=w*1+b
  • 3.043=w*2+b

→ \to Closed Form Solution

  • w=1.477
  • b=0.089

4. With Noise?

  • y=w*x+b+ϵ
  • ϵ ~ N(0,1)
  • 1.567=w*1+b+eps
  • 3.043=w*2+b+eps
  • 4.519=w*2+b+eps

  • → \to
  • Y=(WX+b)

For Example
在这里插入图片描述

  • w?
  • b?

5. Find w ′ w' w b ′ b' b

  • [ ( W X + b − Y ) ] 2 [(WX+b-Y)]^2 [(WX+bY)]2
  • l o s s = ∑ i ( w ∗ x i + b − y i ) 2 loss=\sum_i{(w*x_i+b-y_i)^2} loss=i(wxi+byi)2
  • M i n i m i z e   l o s s Minimize\ loss Minimize loss
  • w ′ ∗ x + b ′ → y w'*x+b'→y wx+by

6. Gradient Descent

(1) 1-D
w ′ = w ′ − l r ∗ d y d w w'=w'-lr*\frac{dy}{dw} w=wlrdwdy
在这里插入图片描述

x ′ = x − 0.005 ∗ d y d w x'=x-0.005*\frac{dy}{dw} x=x0.005dwdy
可以看到,函数的导数始终指向函数值变大的方向,因此,如果要求 l o s s loss loss函数的极小值的话,就需要沿导数的反方向前进,即 − l r ∗ d y d w -lr*\frac{dy}{dw} lrdwdy,衰减因子 l r lr lr的引入是为了防止步长变大,跨度太大。
(2) 2-D
在这里插入图片描述
Find w ′ , b ′ w',b' w,b

  • l o s s = ∑ i ( w ∗ x i + b − y i ) 2 loss=\sum_i{(w*x_i+b-y_i)^2} loss=i(wxi+byi)2
  • 分别对w和b求偏导数,然后沿着偏导数的反向前进,即:
    • w ′ = w − l r ∗ ∂ l o s s ∂ w w'=w-lr*\frac{∂loss}{∂w} w=wlrwloss
    • b ′ = b − l r ∗ ∂ l o s s ∂ b b'=b-lr*\frac{∂loss}{∂b} b=blrbloss
  • w ′ ∗ x + b ′ → y w'*x+b'→y wx+by

Learning Process
在这里插入图片描述

Loss surface
在这里插入图片描述

二. 回归问题实战

1. 步骤

(1) 根据随机初始化的 w , x , b , y w,x,b,y w,x,b,y的数值来计算 L o s s   F u n c t i o n Loss\ Function Loss Function;
(2) 根据当前的 w , x , b , y w,x,b,y w,x,b,y的值来计算梯度;
(3) 更新梯度,将 w ′ w' w赋值给 w w w,如此往复循环;
(4) 最后面的 w ′ w' w b ′ b' b就会作为模型的参数。

2. Step1: Compute Loss

共有100个点,每个点有两个维度,所以数据集维度为 [ 100 , 2 ] [100,2] [100,2],按照 [ ( x 0 , y 0 ) , ( x 1 , y 1 ) , … , ( x 99 , y 99 ) ] [(x_0,y_0 ),(x_1,y_1 ),…,(x_{99},y_{99} )] [(x0,y0),(x1,y1),,(x99,y99)]排列,则损失函数为:
l o s s = [ ( w 0 x 0 + b 0 − y 0 ) ] 2 + [ ( w 0 x 1 + b 0 − y 1 ) ] 2 + ⋯ + [ ( w 0 x 99 + b 0 − y 99 ) ] 2 loss=[(w_0 x_0+b_0-y_0)]^2+[(w_0 x_1+b_0-y_1)]^2+⋯+[(w_0 x_{99}+b_0-y_{99})]^2 loss=[(w0x0+b0y0)]2+[(w0x1+b0y1)]2++[(w0x99+b0y99)]2
即:
l o s s = ∑ i ( w ∗ x i + b − y i ) 2 loss=\sum_i(w*x_i+b-y_i)^2 loss=i(wxi+byi)2
初始值设 w 0 = b 0 = 0 w_0=b_0=0 w0=b0=0
在这里插入图片描述

(1) b和w的初始值都为0,points是传入的100个点,是data.csv里的数据;
(2) len(points)就是传入数据点的个数,即100; range(0, len(points))就代表从0循环到100;
(3) x=points[i, 0]表示取第i个点中的第0个值,即第一个元素,相当于p[i][0]; 同理,y=points[i, 1]表示取第i个点中的第1个值,即第二个元素,相当于p[i][1];
(4) totalError为总损失值,除以是len(points)是平均损失值。

3. Step2: Compute Gradient and update

l o s s 0 = ( w x 0 + b − y 0 ) 2 loss_0=(wx_0+b-y_0)^2 loss0=(wx0+by0)2
∂ l o s s 0 ∂ w = 2 ( w x 0 + b − y 0 ) x 0 \frac{∂loss_0}{∂w}=2(wx_0+b-y_0)x_0 wloss0=2(wx0+by0)x0
∂ l o s s ∂ w = 2 ∑ ( w x i + b − y i ) x i \frac{∂loss}{∂w}=2\sum(wx_i+b-y_i)x_i wloss=2(wxi+byi)xi
∂ l o s s ∂ b = 2 ∑ ( w x i + b − y i ) \frac{∂loss}{∂b}=2\sum(wx_i+b-y_i) bloss=2(wxi+byi)
w ′ = w − l r ∗ ∂ l o s s ∂ w w'=w-lr*\frac{∂loss}{∂w} w=wlrwloss
b ′ = b − l r ∗ ∂ l o s s ∂ b b'=b-lr*\frac{∂loss}{∂b} b=blrbloss

4. Step3: Set w = w ′ w=w' w=wand loop

w ← w ′ w←w' ww
b ← b ′ b←b' bb
在这里插入图片描述

计算出最终的w和b的值就可以带入模型进行预测了:
w ′ x + b ′ → p r e d i c t w' x+b'→predict wx+bpredict

5. 代码

import numpy as np


# y = wx + b
def compute_error_for_line_given_points(b, w, points):
    totalError = 0
    for i in range(0, len(points)):
        x = points[i, 0]
        y = points[i, 1]
        # computer mean-squared-error
        totalError += (y - (w * x + b)) ** 2
    # average loss for each point
    return totalError / float(len(points))


def step_gradient(b_current, w_current, points, learningRate):
    b_gradient = 0
    w_gradient = 0
    N = float(len(points))
    for i in range(0, len(points)):
        x = points[i, 0]
        y = points[i, 1]
        # grad_b = 2(wx+b-y)
        b_gradient += (2 / N) * ((w_current * x + b_current) - y)
        # grad_w = 2(wx+b-y)*x
        w_gradient += (2 / N) * x * ((w_current * x + b_current) - y)
    # update w'
    new_b = b_current - (learningRate * b_gradient)
    new_w = w_current - (learningRate * w_gradient)
    return [new_b, new_w]


def gradient_descent_runner(points, starting_b, starting_w, learning_rate, num_iterations):
    b = starting_b
    w = starting_w
    # update for several times
    for i in range(num_iterations):
        b, w = step_gradient(b, w, np.array(points), learning_rate)
    return [b, w]


def run():
    points = np.genfromtxt("data.csv", delimiter=",")
    learning_rate = 0.0001
    initial_b = 0  # initial y-intercept guess
    initial_w = 0  # initial slope guess
    num_iterations = 1000
    print("Starting gradient descent at b = {0}, w = {1}, error = {2}"
          .format(initial_b, initial_w,
                  compute_error_for_line_given_points(initial_b, initial_w, points))
          )
    print("Running...")
    [b, w] = gradient_descent_runner(points, initial_b, initial_w, learning_rate, num_iterations)
    print("After {0} iterations b = {1}, w = {2}, error = {3}".
          format(num_iterations, b, w,
                 compute_error_for_line_given_points(b, w, points))
          )


if __name__ == '__main__':
    run()

运行结果如下:
在这里插入图片描述

可以看到,在 w = 0 , b = 0 w=0,b=0 w=0,b=0的时候,损失值 e r r o r ≈ 5565.11 error≈5565.11 error5565.11;
在1000轮迭代后, w ≈ 1.48 , b ≈ 0.09 w≈1.48,b≈0.09 w1.48,b0.09,损失值 e r r o r ≈ 112.61 error≈112.61 error112.61,要大大小于原来的损失值。

参考文献:
[1] 龙良曲:《深度学习与TensorFlow2入门实战》

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
深度学习在非线性回归预测方面表现得非常出色,下面我将介绍一个基于 TensorFlow 的实战案例。 首先,我们需要准备数据集。假设我们有一组数据集,其中包含 x 和 y 两个变量,我们的目标是通过训练模型来预测 y 值。我们可以使用 Pandas 库读取数据集,并对其进行预处理,例如归一化操作。 接下来,我们需要设计深度学习模型。在这个例子中,我们可以使用一个带有多层隐藏层的神经网络模型。我们可以使用 Tensorflow 来创建模型,并对其进行训练。训练模型的过程中,我们需要定义损失函数和优化器,以便模型可以在训练中不断优化。 最后,我们可以使用训练好的模型来进行预测。我们可以将测试数据集传递给模型,并获得预测结果。我们可以使用 Matplotlib 库来可视化预测结果,并与原始数据进行比较。 下面是一个基于 TensorFlow 的代码示例: ``` import tensorflow as tf import pandas as pd import matplotlib.pyplot as plt # 读取数据 data = pd.read_csv("data.csv") # 归一化 data = (data - data.mean()) / data.std() # 定义模型 model = tf.keras.Sequential([ tf.keras.layers.Dense(64, activation="relu", input_shape=(1,)), tf.keras.layers.Dense(64, activation="relu"), tf.keras.layers.Dense(1) ]) # 定义损失函数和优化器 model.compile(loss="mse", optimizer=tf.keras.optimizers.Adam(0.01)) # 训练模型 history = model.fit(data["x"], data["y"], epochs=100) # 可视化训练过程 plt.plot(history.history["loss"]) plt.title("Training Loss") plt.xlabel("Epoch") plt.ylabel("Loss") plt.show() # 预测 test_data = pd.read_csv("test_data.csv") test_data = (test_data - data.mean()) / data.std() predictions = model.predict(test_data["x"]) # 可视化预测结果 plt.scatter(data["x"], data["y"]) plt.plot(test_data["x"], predictions, color="red") plt.title("Predictions") plt.xlabel("x") plt.ylabel("y") plt.show() ``` 这个例子中,我们使用了一个带有两个隐藏层的神经网络模型,并对其进行了 100 次训练。最后,我们对测试数据集进行了预测,并使用 Matplotlib 库可视化了预测结果。 当然,这只是一个简单的例子,实际中可能需要更复杂的模型和更大的数据集来进行训练和预测。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值