从线性回归案例理解深度学习思想

我不是主攻人工智能、深度学习方向,但是作为计算机相关领域的学习者,如果不了解下,总觉得已经跟不上时代了,况且,人工智能真的是大势所趋,学会了,能够尝试用在不同领域。

本文将使用回归的思想来求解二元一次方程的最佳解,理解深度学习的根本思想。

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

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

训练结果:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 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
发出的红包

打赏作者

abin在路上

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值