Task 1
線性回歸
模型
線性回歸用于回歸預(yù)測(cè)呕乎,即預(yù)測(cè)一個(gè)連續(xù)的數(shù)值观堂。
一個(gè)n元線性回歸模型
其中 是要模型學(xué)習(xí)的值懈万,
被稱為權(quán)重,
稱為偏置
矩陣形式:
數(shù)據(jù)集
分為訓(xùn)練集泻蚊,驗(yàn)證集躲舌,測(cè)試集。
訓(xùn)練集(平時(shí)的作業(yè)):用于訓(xùn)練模型以學(xué)習(xí)真實(shí)參數(shù)的數(shù)據(jù)的集合性雄。
驗(yàn)證集(模擬考):通常是從訓(xùn)練集中抽取一部分出來(lái)孽糖,不參與訓(xùn)練,用于驗(yàn)證訓(xùn)練效果并調(diào)整訓(xùn)練超參數(shù)的集合毅贮。
測(cè)試集(高考办悟,考研):以其誤差近似模型泛化誤差,測(cè)試模型的泛化能力滩褥。
損失函數(shù)
衡量模型參數(shù)與真實(shí)參數(shù)的差距的函數(shù)病蛉,損失函數(shù)越小說(shuō)明模型參數(shù)的分布越逼近真實(shí)的參數(shù)分布。所以模型學(xué)習(xí)的目標(biāo)即為最小化損失函數(shù)。
對(duì)于線性回歸铺然,由于目標(biāo)是預(yù)測(cè)一個(gè)連續(xù)的數(shù)值俗孝,因此選擇平均平方誤差和損失函數(shù)-均方差損失函數(shù)(Mean Square Error-MSE)。
其中常數(shù)使對(duì)平方項(xiàng)求導(dǎo)后的常數(shù)系數(shù)為1魄健,這樣在形式上稍微簡(jiǎn)單一些赋铝。
為什么要用它作為損失函數(shù)?:
在回歸問(wèn)題中沽瘦,
的測(cè)量值
會(huì)存在一定的誤差革骨。
假定對(duì)所有的數(shù)據(jù)點(diǎn)
,模型預(yù)測(cè)值
與目標(biāo)值
之間的誤差是一樣的析恋,并服從一定的概率分布良哲,比如均值為0,方差為
的高斯分布助隧,則有:
[圖片上傳失敗...(image-16013e-1581687516972)]
即:
[圖片上傳失敗...(image-30e8c9-1581687516972)]
image對(duì)于一組獨(dú)立同分布的數(shù)據(jù)點(diǎn) [圖片上傳失敗...(image-3941f3-1581687516972)] 筑凫,以及這些數(shù)據(jù)對(duì)應(yīng)的目標(biāo)值 [圖片上傳失敗...(image-4d30cd-1581687516972)] ,我們得到關(guān)于這組數(shù)據(jù)的似然函數(shù):
[圖片上傳失敗...(image-bed5e9-1581687516972)]
其中并村,高斯分布的概率函數(shù)為:
[圖片上傳失敗...(image-ab5ed8-1581687516972)]
可以通過(guò)極大化這個(gè)似然函數(shù)得到關(guān)于
的一組極大似然解巍实。
不過(guò),更方便的做法是極大對(duì)數(shù)似然函數(shù)哩牍,因?yàn)閷?duì)數(shù)函數(shù)是嚴(yán)格單增的蔫浆,所以極大對(duì)數(shù)似然的解與極大似然的解是相同的。
對(duì)數(shù)似然函數(shù)為:
[圖片上傳失敗...(image-4a09ba-1581687516972)]
如果我們不考慮
的影響姐叁,那么瓦盛,對(duì)于參數(shù)
來(lái)說(shuō),最小化平方誤差和的解外潜,就等于極大對(duì)數(shù)似然的估計(jì)原环。
因此,最小化平方誤差和
與極大似然等價(jià)处窥,考慮到似然函數(shù)的定義嘱吗,優(yōu)化
相當(dāng)于在給定高斯誤差的假設(shè)下,尋找一組
使得觀察到目標(biāo)值
的概率最大滔驾。
作者:李金ECHO
鏈接:https://zhuanlan.zhihu.com/p/33568166
來(lái)源:知乎
著作權(quán)歸作者所有谒麦。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處哆致。
優(yōu)化函數(shù)-隨機(jī)梯度下降
用以搜索改進(jìn)模型參數(shù)使得目標(biāo)(損失函數(shù))最小化的方法绕德。
在每次迭代中,先隨機(jī)均勻采樣一個(gè)由固定數(shù)目訓(xùn)練數(shù)據(jù)樣本所組成的小批量(mini-batch)
摊阀,然后求小批量中數(shù)據(jù)樣本的平均損失有關(guān)模型參數(shù)的導(dǎo)數(shù)(梯度)耻蛇,最后用此結(jié)果與預(yù)先設(shè)定的一個(gè)正數(shù)的乘積作為模型參數(shù)在本次迭代的減小量踪蹬。
在上式中,代表每個(gè)小批量中的樣本個(gè)數(shù)(批量大小臣咖,batch size)跃捣,
稱作學(xué)習(xí)率(learning rate)并取正數(shù)。
關(guān)鍵如何求出在于損失函數(shù)對(duì)于所有待學(xué)習(xí)參數(shù)的梯度 -》矩陣求導(dǎo)+反向傳播
矩陣求導(dǎo)術(shù)(上) - 長(zhǎng)軀鬼俠的文章 - 知乎 https://zhuanlan.zhihu.com/p/24709748
矩陣求導(dǎo)術(shù)(下) - 長(zhǎng)軀鬼俠的文章 - 知乎 https://zhuanlan.zhihu.com/p/24863977
Matrix Cookbook-MIT
其他的一些基于梯度的神經(jīng)網(wǎng)絡(luò)優(yōu)化算法:
- SGD+動(dòng)量(Momentum)
- Nesterov梯度加速法
- Adagrad
- AdaDelta
- Adam
一文看懂各種神經(jīng)網(wǎng)絡(luò)優(yōu)化算法:從梯度下降到Adam方法 - 量子學(xué)園的文章 - 知乎 https://zhuanlan.zhihu.com/p/27449596
矢量計(jì)算
在python中夺蛇,通常使用經(jīng)過(guò)優(yōu)化的科學(xué)計(jì)算庫(kù)如numpy疚漆,pytorch等,進(jìn)行矢量計(jì)算比循環(huán)快非常多(幾十到上百倍)
而且并行化的矢量計(jì)算更適于GPU的運(yùn)算刁赦。
pytorch實(shí)現(xiàn)以及知識(shí)點(diǎn)
import torch
import torch.nn as nn
import torch.utils.data as data
import numpy as np
# 確定真實(shí)權(quán)重(娶聘,偏置)
true_w = [3.5,-1.6]
true_b = 6.6
# 生成若干樣本,并在y上加上服從正態(tài)分布的誤差
X = np.random.rand(10,2)*3
Y = np.dot(X,true_w)
Y+=np.random.normal(0,0.01,10)
X = torch.Tensor(X)
Y = torch.Tensor(Y)
#模型結(jié)構(gòu)
class LinearNet(nn.Module):
def __init__(self):
super(LinearNet,self).__init__()
self.linear = nn.Linear(2,1)
def forward(self,x):
return self.linear(x)
net = LinearNet()
#數(shù)據(jù)生成器
dataset = data.DataLoader(data.TensorDataset(X,Y),batch_size=2,num_workers=1)
import torch.optim as optim
#聲明優(yōu)化器
optimizer = optim.SGD(net.parameters(), lr=0.03)
epoch = 20
cri = nn.MSELoss()
for i in range(epoch):
for x,y in dataset:
#模型預(yù)測(cè)結(jié)果
out = net(x)
#計(jì)算損失
l = cri(out,y.view(-1,1))
#重置優(yōu)化器梯度
optimizer.zero_grad()
#反向傳播
l.backward()
# 一步優(yōu)化
optimizer.step()
print('epoch %d, loss: %f' % (i+1, l.item()))
Softmax與分類模型
softmax
作用:
將向量的各分量壓縮到0-1的范圍-概率形式
通過(guò)指數(shù)函數(shù)將最大的分量放大截型,從而擴(kuò)大最大的分量與其他分量的差距,同時(shí)能保留部分分量(所謂的soft)儒溉。
-
與交叉熵?fù)p失函數(shù)結(jié)合宦焦,梯度形式簡(jiǎn)潔
當(dāng)我們對(duì)分類的Loss進(jìn)行改進(jìn)的時(shí)候,我們要通過(guò)梯度下降顿涣,每次優(yōu)化一個(gè)step大小的梯度
我們定義選到y(tǒng)i的概率是
[圖片上傳失敗...(image-b9208c-1581687516972)]
然后我們求Loss對(duì)每個(gè)權(quán)重矩陣的偏導(dǎo)波闹,應(yīng)用鏈?zhǔn)椒▌t(中間推導(dǎo)省略)。
[圖片上傳失敗...(image-fbee6c-1581687516972)]
最后結(jié)果的形式非常的簡(jiǎn)單涛碑,只要將算出來(lái)的概率的向量對(duì)應(yīng)的真正結(jié)果的那一維減1精堕,就可以了
作者:楊思達(dá)zzzz
鏈接:https://www.zhihu.com/question/23765351/answer/139826397
來(lái)源:知乎
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán)蒲障,非商業(yè)轉(zhuǎn)載請(qǐng)注明出處歹篓。
交叉熵?fù)p失函數(shù)
衡量數(shù)據(jù)之間分布差距 -》目標(biāo):最小化模型預(yù)測(cè)分類概率分布與真實(shí)分類概率分布的差距
兩種理解方式:
-
KL散度
為了讓學(xué)到的模型分布更貼近真實(shí)數(shù)據(jù)分布,我們最小化 模型數(shù)據(jù)分布 與 訓(xùn)練數(shù)據(jù)之間的KL散度揉阎,而因?yàn)橛?xùn)練數(shù)據(jù)的分布是固定的庄撮,因此最小化KL散度等價(jià)于最小化交叉熵。
為什么交叉熵(cross-entropy)可以用于計(jì)算代價(jià)毙籽? - 微調(diào)的回答 - 知乎 https://www.zhihu.com/question/65288314/answer/244557337
-
分類模型最大化似然函數(shù)
給定一個(gè)包含
個(gè)數(shù)據(jù)樣本的訓(xùn)練集 [圖片上傳失敗...(image-b1664f-1581687516972)] 洞斯,以及這些數(shù)據(jù)對(duì)應(yīng)的類別 [圖片上傳失敗...(image-f69f45-1581687516972)] ,這里坑赡, [圖片上傳失敗...(image-8a411b-1581687516972)] 烙如,分類問(wèn)題的目標(biāo)是利用這組訓(xùn)練集,尋找一個(gè)合適的模型毅否,來(lái)預(yù)測(cè)一個(gè)新的數(shù)據(jù)點(diǎn)
對(duì)應(yīng)的類別
⊙翘現(xiàn)在假設(shè)模型的參數(shù)為
,模型輸出是屬于每一類的概率螟加,預(yù)測(cè)為第 [圖片上傳失敗...(image-dc0399-1581687516972)] 類的概率為 [圖片上傳失敗...(image-22d8e2-1581687516972)] 刀闷。
對(duì)于樣本
熊泵,其屬于第
類的概率為:
[圖片上傳失敗...(image-648599-1581687516972)]
因此,似然函數(shù)為:
[圖片上傳失敗...(image-8ed587-1581687516972)]
對(duì)數(shù)似然為:
[圖片上傳失敗...(image-c0d8b2-1581687516972)]
極大化對(duì)數(shù)似然甸昏,相當(dāng)于極小化:
[圖片上傳失敗...(image-5fcfe-1581687516972)]
事實(shí)上顽分,這正是我們常使用的多類交叉熵?fù)p失函數(shù)的表示形式。
因此施蜜,在分類問(wèn)題中卒蘸,最小化交叉熵?fù)p失函數(shù)相當(dāng)與極大樣本的似然函數(shù)。
單層Softmax分類器實(shí)現(xiàn)圖像分類
import torch
import torchvision
import torchvision.transforms as transforms
import torch.nn as nn
#下載FashionMNIST數(shù)據(jù)集
mnist_train = torchvision.datasets.FashionMNIST(root='./Datasets/FashionMNIST', train=True, download=True, transform=transforms.ToTensor())
mnist_test = torchvision.datasets.FashionMNIST(root='./Datasets/FashionMNIST', train=False, download=True, transform=transforms.ToTensor())
# 讀取數(shù)據(jù)
batch_size = 256
num_workers = 4
train_iter = torch.utils.data.DataLoader(mnist_train, batch_size=batch_size, shuffle=True, num_workers=num_workers)
test_iter = torch.utils.data.DataLoader(mnist_test, batch_size=batch_size, shuffle=False, num_workers=num_workers)
num_inputs = 784
num_outputs = 10
class classifier(nn.Module):
def __init__(self):
super(classifier,self).__init__()
self.linear = nn.Linear(num_inputs,num_outputs)
self.sm = nn.Softmax(1)
def forward(self,x):
x = self.linear(x.view(-1,num_inputs))
return self.sm(x)
net = classifier()
nn.init.normal_(net.linear.weight, mean=0, std=0.1)
nn.init.constant_(net.linear.bias, val=0)
loss = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(net.parameters(), lr=0.1)
epoch = 5
for i in range(epoch):
train_l_sum, train_acc_sum, train_num = 0.0, 0.0, 0
for x,y in train_iter:
out = net(x)
l = loss(out,y).sum()
optimizer.zero_grad()
l.backward()
optimizer.step()
train_l_sum += l.item()
train_acc_sum += (out.argmax(dim=1) == y).sum().item()
train_num += y.shape[0]
test_acc_sum,test_num = 0,0
for x,y in test_iter:
out = net(x)
test_acc_sum += (out.argmax(dim=1) == y).sum().item()
test_num += y.shape[0]
print('epoch %d, loss %.4f, train acc %.3f, test acc %.3f'
% (i + 1, train_l_sum / train_num, train_acc_sum / train_num, test_acc_sum/test_num))
多層感知機(jī)
隱藏層
多層隱藏層可以理解為對(duì)數(shù)據(jù)進(jìn)行不同層次抽象特征的提取
通用近似定理 (Universal approximation theorem):如果一個(gè)前饋神經(jīng)網(wǎng)絡(luò)具有線性輸出層和至少一層隱藏層翻默,只要給予網(wǎng)絡(luò)足夠數(shù)量的神經(jīng)元缸沃,便可以實(shí)現(xiàn)以足夠高精度來(lái)逼近任意一個(gè)在 ?n 的緊子集 (Compact subset) 上的連續(xù)函數(shù)。
激活函數(shù)
仿射變換:
在不增加非線性的激活函數(shù)時(shí)修械,多層感知機(jī)仍等價(jià)于單層仿射變換趾牧。
常見(jiàn)激活函數(shù)
sigmoid
- 映射到0-1
- 存在梯度消失
- 計(jì)算exp消耗較大
tanh
- 存在梯度消失
- 關(guān)于原點(diǎn)對(duì)稱
ReLU
- 運(yùn)算速度快
- 緩解梯度消失
- 存在神經(jīng)元死亡現(xiàn)象
LeakyReLU
- 解決神經(jīng)元死亡問(wèn)題
PReLU
- 解決神經(jīng)元死亡問(wèn)題
Maxout
- 對(duì)ReLU和LeakyReLU的一般化歸納
- 解決神經(jīng)元死亡問(wèn)題
- 參數(shù)數(shù)量較多
多層感知機(jī)圖像分類
將Softmax分類器的結(jié)構(gòu)改為:
num_inputs = 784
num_hidden = 100
num_outputs = 10
class classifier(nn.Module):
def __init__(self):
super(classifier,self).__init__()
self.linear1 = nn.Linear(num_inputs,num_hidden)
self.relu = nn.ReLU()
self.linear2 = nn.Linear(num_hidden,num_outputs)
self.sm = nn.Softmax(1)
def forward(self,x):
x = self.linear1(x.view(-1,num_inputs))
x = self.linear2(self.relu(x))
return self.sm(x)
net = classifier()
nn.init.normal_(net.linear1.weight, mean=0, std=0.1)
nn.init.constant_(net.linear1.bias, val=0)
nn.init.normal_(net.linear2.weight, mean=0, std=0.1)
nn.init.constant_(net.linear2.bias, val=0)
Task 2
文本預(yù)處理
讀入文本
分詞
漢語(yǔ)NLP庫(kù):
HanLP
中文分詞 詞性標(biāo)注 命名實(shí)體識(shí)別 依存句法分析 語(yǔ)義依存分析 新詞發(fā)現(xiàn) 關(guān)鍵詞短語(yǔ)提取 自動(dòng)摘要 文本分類聚類 拼音簡(jiǎn)繁轉(zhuǎn)換 自然語(yǔ)言處理
https://github.com/hankcs/HanLP
jieba
結(jié)巴中文分詞
https://github.com/fxsjy/jieba
綜合
awesome-chinese-nlp 中文自然語(yǔ)言處理相關(guān)資料
https://github.com/crownpku/Awesome-Chinese-NLP
其他語(yǔ)言NLP庫(kù):
綜合
awesome-nlp - A curated list of resources dedicated to Natural Language Processing (NLP)
https://github.com/keon/awesome-nlp
NLTK
建立字典
考慮詞頻閾值,是否使用特殊token
- '<pad>' - padding肯污, 填充句子使得句子等長(zhǎng)
- '<bos>' - beginning of sentence翘单,句子開頭標(biāo)記
- '<eos>' - end of sentence, 句子結(jié)束標(biāo)記
- '<unk>' - unknown蹦渣,不在詞庫(kù)中的詞的標(biāo)記
詞序列轉(zhuǎn)換為索引序列
語(yǔ)言模型
基于n元語(yǔ)法的語(yǔ)言模型
- 語(yǔ)言模型 - 用于計(jì)算一個(gè)句子是人講的概率的模型(通順與否)
詞語(yǔ)序列
則一個(gè)句子的概率表示為
- 馬爾科夫假設(shè) - 任意一個(gè)詞出現(xiàn)的概率之和它前面的幾個(gè)詞(上文)有關(guān)
一元模型:
二元模型:
時(shí)序數(shù)據(jù)的采樣
隨機(jī)采樣
每個(gè)樣本是原始序列上任意截取的一段序列哄芜,相鄰的兩個(gè)隨機(jī)小批量在原始序列上的位置不一定相毗
X: tensor([[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17]])
Y: tensor([[ 7, 8, 9, 10, 11, 12],
[13, 14, 15, 16, 17, 18]])
X: tensor([[ 0, 1, 2, 3, 4, 5],
[18, 19, 20, 21, 22, 23]])
Y: tensor([[ 1, 2, 3, 4, 5, 6],
[19, 20, 21, 22, 23, 24]])
相鄰采樣
在相鄰采樣中,相鄰的兩個(gè)隨機(jī)小批量在原始序列上的位置相毗鄰柬唯。
X: tensor([[ 0, 1, 2, 3, 4, 5],
[15, 16, 17, 18, 19, 20]])
Y: tensor([[ 1, 2, 3, 4, 5, 6],
[16, 17, 18, 19, 20, 21]])
X: tensor([[ 6, 7, 8, 9, 10, 11],
[21, 22, 23, 24, 25, 26]])
Y: tensor([[ 7, 8, 9, 10, 11, 12],
[22, 23, 24, 25, 26, 27]])
循環(huán)神經(jīng)網(wǎng)絡(luò)
[圖片上傳失敗...(image-f8e810-1581687516972)]
在時(shí)間步t认臊,隱藏狀態(tài):
輸出為:(沒(méi)有激活函數(shù))
隱藏狀態(tài)可視為保存了在該時(shí)間步前的歷史信息
Task 3
過(guò)擬合、欠擬合及其解決方案
- 訓(xùn)練誤差 - 模型在訓(xùn)練集上表現(xiàn)得誤差
- 泛化誤差 - 模型在任意非訓(xùn)練集樣本數(shù)表現(xiàn)得誤差的(期望)
欠擬合
模型的訓(xùn)練誤差和泛化誤差都較高锄奢,即模型不能很好地從訓(xùn)練樣本中學(xué)習(xí)
解決方法:
增加輸入特征
減少正則化參數(shù)
增加模型復(fù)雜度
過(guò)擬合
模型的訓(xùn)練誤差遠(yuǎn)低于泛化誤差失晴,即模型學(xué)習(xí)到的特征不能很好地從訓(xùn)練集泛化到測(cè)試集,而是只屬于訓(xùn)練集的特征
解決辦法:
增加訓(xùn)練樣本
采用正則化方法
dropout-丟棄法
Batch Normalization
梯度消失與梯度爆炸
梯度消失與梯度爆炸的根本原因都是由于梯度更新的反向傳播方法拘央,在神經(jīng)網(wǎng)絡(luò)層數(shù)過(guò)深時(shí)师坎,對(duì)于離輸出層越遠(yuǎn)的層,如果輸出層的梯度大于1堪滨,其梯度會(huì)呈指數(shù)形式增加胯陋;如果小于1,其梯度會(huì)呈指數(shù)形式遞減袱箱。
梯度消失一般出現(xiàn)于深層網(wǎng)絡(luò)遏乔,或使用了不合適的激活函數(shù)
梯度爆炸一般出現(xiàn)于深層網(wǎng)絡(luò),或權(quán)值初始化太大
解決方法:
- - 預(yù)訓(xùn)練加微調(diào)
- - 梯度剪切发笔、權(quán)重正則(衰減)(針對(duì)梯度爆炸)
- - 使用不同的激活函數(shù)
- - 使用batchnorm
- - 使用殘差結(jié)構(gòu)
- - 使用LSTM網(wǎng)絡(luò)
詳解深度學(xué)習(xí)中的梯度消失盟萨、爆炸原因及其解決方法 - DoubleV的文章 - 知乎 https://zhuanlan.zhihu.com/p/33006526
循環(huán)神經(jīng)網(wǎng)絡(luò)進(jìn)階
GRU - Gate Recurrent Unit
[圖片上傳失敗...(image-f03716-1581687516972)]
[圖片上傳失敗...(image-e0154-1581687516972)]
Reset door 重置門
Update door 更新門
候選隱藏狀態(tài)門
原文中隱藏狀態(tài)與輸入的連結(jié)方式是 Concatenate,此處公式等價(jià)
在更新門中或在候選狀態(tài)中等價(jià)
LSTM - Long Short Term Memory
[圖片上傳失敗...(image-c908d6-1581687516972)]
人人都能看懂的LSTM介紹及反向傳播算法推導(dǎo)(非常詳細(xì)) - 陳楠的文章 - 知乎 https://zhuanlan.zhihu.com/p/83496936
LSTM細(xì)節(jié)分析理解(pytorch版) - ymmy的文章 - 知乎 https://zhuanlan.zhihu.com/p/79064602