softmax函數,可以將算出來的預測值轉換成0-1之間的概率形式

導數的形式

import torch import torch.nn.functional as F x=torch.tensor([3.3,2.2,1.0]) x.requires_grad_() y=F.softmax(x,dim=0) print('將x轉換成概率型的y',y) print(y[0],x[0]) print('對y1進行求導,由於y是由所有xi來生成的,所以傳輸入的時候要把所有的x傳進去') #由於y=0.6978,0.2323,0.07. 所以有導數公式dy1/dx1=0.6978*(1-0.6978)=0.2109 dy1/dx2=-0.6978*0.2323=-0.162 print('y0對上x0-x3三個方向上的導數',torch.autograd.grad(outputs=y[0], inputs=x)) y=F.softmax(x,dim=0) print('y1對上x0-x3三個方向上的導數',torch.autograd.grad(outputs=y[1], inputs=x)) y=F.softmax(x,dim=0) print('y2對上x0-x3三個方向上的導數',torch.autograd.grad(outputs=y[2], inputs=x))
單層感知機

x的上標代表層數,下面的下標代表的是節點的編號。w的上標是下一層,下標的第一位是上一層的節點的編號,第二位是上一層
第0層的n個節點通過權值相乘再累加得到下一層的x,然后x通過激活函數再計算損失


import torch import torch.nn.functional as F x=torch.rand(1,10) w=torch.rand(1,10) print('x向量',x,'w向量',w) w.requires_grad_() y=torch.sigmoid(x@w.t()) #是向量相乘然后求sigmoid函數變到下一層的神經元x countshape=list(y.shape) #看它的shape print(y.shape,countshape) loss=F.mse_loss(torch.ones(countshape),y) #用torch.ones(shape值)和下層神經元x(y)求loss print(loss) # print(torch.ones(countshape)) loss.backward() print(w.grad) #求得y對所有的wi梯度
多層感知機

#感知機的第二層有兩個x x=torch.rand(1,10) w=torch.rand(2,10) #w有兩維,也就是兩組,意味着兩組分別與xi構成兩個下一層的 print('x向量',x,'w向量',w) #這里是二維的,就說明 w.requires_grad_() y=torch.sigmoid(x@w.t()) #是向量相乘然后求sigmoid函數變到下一層的神經元x countshape=list(y.shape) #看它的shape print(y.shape,countshape) loss=F.mse_loss(torch.ones(countshape),y) #用torch.ones(shape值)和下層神經元x(y)求loss print(loss) # print(torch.ones(countshape)) loss.backward() print(w.grad) #求得yi(i屬於0--1)對所有的wj(j屬於0--9)梯度
鏈式法則

x=torch.tensor(1.) w1=torch.tensor(2.) w1.requires_grad_() b1=torch.tensor(1.) w2=torch.tensor(2.) w2.requires_grad_() b2=torch.tensor(1.) y1=x*w1+b1 y2=y1*w2+b2 print('輸入的x(%s),經過w1(%s)和b1(%s),生成y1(%s).再通過w2(%s)和b2(%s)生成y2(%s)' %(x,w1,b1,y1,w2,b2,y2)) #現實的情況一般是已知輸入然后去求權重和偏置,因此最終要求的總梯度是dy2_dw1 dy2_dy1=torch.autograd.grad(y2,[y1],retain_graph=True)[0] dy1_dw1=torch.autograd.grad(y1,[w1],retain_graph=True)[0] print(dy2_dy1*dy1_dw1) dy2_dw1=torch.autograd.grad(y2,[w1],retain_graph=True)[0] print(dy2_dw1)
函數極小值的優化
1.用plt畫出圖像
from matplotlib import pyplot as plt from mpl_toolkits.mplot3d import Axes3D import numpy as np def fomul(x): return (x[0]**2+x[1]-11)**2+(x[0]+x[1]**2-7)**2 x=np.arange(-6,6,0.1) y=np.arange(-6,6,0.1) X,Y=np.meshgrid(x,y) #這一步是制作出x和y的網格化矩陣 print([X,Y]) #這一步是兩個網格化矩陣放進列表 Z=fomul([X,Y]) #將x的網格化矩陣和y的網格化矩陣放進公式計算出z的網格化矩陣 fig = plt.figure() ax = plt.gca(projection='3d') ax.plot_surface(X,Y,Z) ax.view_init(60,-30) plt.show()
邏輯回歸
使用sigmore函數轉變成概率
liner regression 和 logistic regression的區別:
- 輸出的區別. linear regression的輸出是連續的,在有限空間可取任意值; logistic regression的輸出期望是離散的,只有有限個數值.
- 預期目標(label)的區別. linear regression的預期是連續變量,如auto-encoder模型預測一張圖像; logistir regression的預期是離散的類別.
- 最小化誤差的方法區別. 采用均方誤差的linear regression對於大的誤差施加二次倍數的懲罰, 而logistic regression把較大的誤差懲罰到一個漸進的常數.
- 先驗的區別.liner regression期望擬合訓練數據,通過feature的線性加權來預測結果; logistic regression是在訓練一個最大似然分類器
多分類問題

要將輸出值轉化到多分類的概率可以使用之前說的softmax函數來轉換
分類問題中常用的loss損失:cross entropy(交叉熵)

Dkl指的是散度,散開的程度,當p和q相等的時候重合的時候,散度是接近於0的因此H(p,q)就只等於H(p)
對於01編碼的情況時,[0 1 0 0], 熵=-1log1=0,此時交叉熵等於散度

二分類問題的公式推導。p的概率是預測標簽為1的概率。當標簽y=0的時候,相應的log(1-p)大也就是標簽1的概率要大。當標簽y=1的時候,相應的log(p)大也就是標簽0的概率要大。

分類的目的就是原本的q1的幾個概率沒有逼近1的,此時交叉熵也比較大。經過不斷的迭代q1里面出現有一個概率是非常接近1的,而且它的交叉熵此時會變得非常小。自然預測值就是那個概率最大的。
