08 线性回归 + 基础优化算法【动手学深度学习v2】
線性回歸
輸出層不當成一層 輸入層和權重層放一起
x和y是列向量
因為loss=1/2(y-y_hat)^2
又因為y_hat的平均值=1/n(xi*w+b)=1/n(Xw+b)
唯一一個有顯示解的模型
基礎優化方法
不但更新w
負梯度:下降最快的方向 即圖中負梯度的方向
n:學習率 表示我沿著這個方向每次走多遠
類似下山的時候每次沿著最陡的地方走一大步 這樣很快就可以到山低
學習率太小需要走很多步 計算很多次梯度
學習率太大會震蕩 錯過 并不是真正的在下降
從零開始實現整個方法,包括數據流水線、模型。損失函數和小批量隨機梯度下降優化器。
使用深度學習框架來簡潔地實現線性回歸模型生成數據集
import numpy as np import torch from torch.utils import data from d2l import torch as d2ltrue_w = torch.tensor([2, -3.4]) true_b = 4.2 features, labels = d2l.synthetic_data(true_w, true_b, 1000)# 調用框架中現有的API來讀取數據 def load_array(data_arrays, batch_size, is_train=True):"""構造一個pytorch數據迭代器"""dataset = data.TensorDataset(*data_arrays) # 將X和 y傳進去# 得到數據集之后調用DataLoader# shuffle:是不是需要隨機打亂順序return data.DataLoader(dataset, batch_size, shuffle=is_train)batch_size = 10 data_iter = load_array((features, labels), batch_size)print(next(iter(data_iter))) # 得到x和y# 使用框架的預定義好的層 from torch import nnnet = nn.Sequential(nn.Linear(2, 1)) # 輸入和輸出的維度# 初始化模型參數 # net[0]訪問linear,.weight訪問w,.data真實值,normal_使用正態分布替換掉data值 print(net[0].weight.data.normal_(0, 0.01)) # bias偏差設置為0 print(net[0].bias.data.fill_(0))# 計算均方誤差使用的是MSELoss類(L2范數) loss = nn.MSELoss()# 實例化SGD實例 # net.parameters():所有的參數 trainer = torch.optim.SGD(net.parameters(), lr=0.03)# 訓練過程 num_epochs = 3 # 三次 for epoch in range(num_epochs):for X, y in data_iter:l = loss(net(X), y) # net本身帶有模型參數trainer.zero_grad() # 梯度清零l.backward()trainer.step() # 模型更新l = loss(net(features), labels)print(f'epoch{epoch + 1}, loss {l:f}')問題答疑:
-
關于神經網絡 我們是通過誤差反饋修改參數
-
batchsize越小收斂越小 一定的噪音使得網絡不會偏 泛化性更好
-
針對batchsize大小的數據集進行網絡訓練的時候,網絡中每個參數更新時的減去的梯度是batchsize中每個樣本對應參數梯度求和后取得的平均值
-
隨機梯度下降的‘隨機’指的是在樣本中隨機采集batchsize大小個的元素
-
統計模型和優化模型 我關心的是收斂到哪 不是收斂快不快
-
使用yield而不是return 是因為每次生成一個batchsize接著生成就好,還有就是因為習慣
-
如果樣本大小不是批量數的整數倍,那需要隨機剔除多余的樣本
嗎?答:如果是1000=個樣本 batchsize=60 (1)就取剩下的40個(2)丟掉剩下的40個(3)從下一個epoch再補20個 -
判斷收斂?1用驗證數據集看其梯度有沒有增加 2看兩個epoch直接目標函數已經變化不大了就表示收斂了
-
本質上我們為什么要用SGD(隨機梯度下降),是因為大部分的實際loss太復雜,推導不出導數為0的解么?只能逐個batch去逼近? 答:是的
總結
以上是生活随笔為你收集整理的08 线性回归 + 基础优化算法【动手学深度学习v2】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 栈与队列-
- 下一篇: 梳理百年深度学习发展史-七月在线机器学习