线性回归基于几个简单的假设:
常用术语
线性假设是指目标(房屋价格)可以表示为特征(面积和房龄)的加权和,如下面的式子:
y = wx +b
w : 权重
b :偏置,常数
寻找最好的模型参数(model parameters)w和b之前, 我们还需要两个东西:
损失函数(loss function)能够量化目标的实际值与预测值之间的差距。
通常我们会选择非负数作为损失,且数值越小表示损失越小,完美预测时的损失为0
回归问题中最常用的损失函数是平方误差函数。
梯度下降(gradient descent)这种方法几乎可以优化所有深度学习模型。
它通过不断地在损失函数递减的方向上更新参数来降低误差。
给定特征估计目标的过程通常称为预测(prediction)或推断(inference)
对计算进行矢量化, 从而利用线性代数库
实例验证
我们实例化两个全为1的10000维向量。 在一种方法中,我们将使用Python的for循环遍历向量; 在另一种方法中,我们将依赖对+的调用。
%matplotlib inline
import math
import time
import numpy as np
import torch
from d2l import torch as d2l
n = 10000
a = torch.ones(n)
b = torch.ones(n)
# 定义一个计时器
class Timer: #@save
"""记录多次运行时间"""
def __init__(self):
self.times = []
self.start()
def start(self):
"""启动计时器"""
self.tik = time.time()
def stop(self):
"""停止计时器并将时间记录在列表中"""
self.times.append(time.time() - self.tik)
return self.times[-1]
def avg(self):
"""返回平均时间"""
return sum(self.times) / len(self.times)
def sum(self):
"""返回时间总和"""
return sum(self.times)
def cumsum(self):
"""返回累计时间"""
return np.array(self.times).cumsum().tolist()
# for循环,每次执行一位的加法
c = torch.zeros(n)
timer = Timer()
for i in range(n):
c[i] = a[i] + b[i]
f'{timer.stop():.5f} sec'
'0.08695 sec'
# 重载的+运算符来计算按元素的和
timer.start()
d = a + b
f'{timer.stop():.5f} sec'
'0.00025 sec'
矢量化代码通常会带来数量级的加速。
减少了出错的可能性
对噪声分布的假设来解读平方损失目标函数
将线性回归模型描述为一个神经网络。
需要注意的是,该图只显示连接模式,即只显示每个输入如何连接到输出,隐去了权重和偏置的值。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wek3m4Za-1662219434913)(https://zh.d2l.ai/_images/singleneuron.svg)]
对于线性回归,每个输入都与每个输出(在本例中只有一个输出)相连, 将这种变换 称为全连接层(fully-connected layer)或称为稠密层(dense layer)。
在深度学习中的灵感同样或更多地来生物学、自数学、统计学和计算机科学。
机器学习模型中的关键要素是训练数据、损失函数、优化算法,还有模型本身。
矢量化使数学表达上更简洁,同时运行的更快。
最小化目标函数和执行极大似然估计等价。
线性回归模型也是一个简单的神经网络。