梯度下降處理softmax函數多分類問題


 softmax函數簡介與符號說明

softmax函數適用於處理多分類問題,應用廣泛的邏輯函數就是softmax函數在二分類情形下的特例。softmax函數將一個n維的輸入向量映射為n維的向量,使得輸出向量的各元素取值在0到1之間,且所有元素之和為1,即所得到的向量可以作為事件發生的概率。
記函數的輸入向量為:$Z = (z_1,z_2,\cdots,z_n)^\top$,則函數值為:
$$softmax(X) =(\frac{e^{x_1}}{\sum_{i=1}^{n}e^{x_i}},\frac{e^{x_2}}{\sum_{i=1}^{n}e^{x_i}},\cdots,\frac{e^{x_n}}{\sum_{i=1}^{n}e^{x_i}})^\top$$
對一個激活函數為softmax的單個神經元,記輸入數據是由對n個特征進行m次觀測所得的樣本:
$$
X=\left[
\begin{matrix}
x_{10} & x_{11} & x_{12} & \cdots & x_{1n} \\
x_{20} & x_{21} & x_{22} & \cdots & x_{2n} \\
\vdots & \vdots & \vdots & \ddots & \vdots \\
x_{m0} & x_{m1} & x_{m2} & \cdots & x_{mn} \\
\end{matrix}
\right]
$$
其中,$\mathbf{X}$第一列數據全部為1,是人為加入的bias項,表示模型帶有偏置(即考慮截距項)。$\mathbf{X}_{ij}(1\leq i\leq m,1\leq j\leq n)$表示第j個變量在第i次觀測時的值。
該樣本對應的真實類別為:
$$
Y=\left[
\begin{matrix}
y_{11} & y_{12} & \cdots & y_{1k} \\
y_{21} & y_{22} & \cdots & y_{2k} \\
\vdots & \vdots & \ddots & \vdots \\
y_{m1} & y_{m2} & \cdots & y_{mk} \\
\end{matrix}
\right]
$$
Y的每一行只有一個值為1,其它全為0。$y_{ij}=1 (1\leq i\leq m,1\leq j\leq k)$表示第i個樣本對應的類別為第j類。
記待估計的參數為
$$
\Omega = \left[
\begin{matrix}
\omega_{01} & \omega_{02} & \cdots & \omega_{0k} \\
\omega_{11} & \omega_{12} & \cdots & \omega_{1k} \\
\omega_{21} & \omega_{22} & \cdots & \omega_{2k} \\
\vdots & \vdots & \ddots & \vdots \\
\omega_{n1} & \omega_{n2} & \cdots & \omega_{nk} \\
\end{matrix}
\right]
$$
記softmax函數的自變量為:
$$
Z = \left[
\begin{matrix}
z_{11} & z_{12} & \cdots & z_{1k} \\
z_{21} & z_{22} & \cdots & z_{2k} \\
\vdots & \vdots & \ddots & \vdots \\
z_{m1} & z_{m2} & \cdots & z_{mk} \\
\end{matrix}
\right]
$$
Z是模型輸入數據的加權求和,即$z_{ij} = \sum_{k=0}^{n}x_{ik}\omega_{kj}$,$Z = X\Omega$。
記$$
\hat{Y} = softmax(Z) =
\left[
\begin{matrix}
\hat{y}_{11} & \hat{y}_{12} & \cdots & \hat{y}_{1k} \\
\hat{y}_{21} & \hat{y}_{22} & \cdots & \hat{y}_{2k} \\
\vdots & \vdots & \ddots & \vdots \\
\hat{y}_{m1} & \hat{y}_{m2} & \cdots & \hat{y}_{mk} \\
\end{matrix}
\right]
$$
其中$\hat{y}_{ij} = \frac{e^{z_{ij}}}{\sum_{p=1}^{k}e^{z_{ip}}}$,表示模型眼中第i個樣本屬於第j類的概率。
定義模型的總代價函數為
$$
COST(X) = \sum_{i=0}^{m}(-\sum_{j=1}^{k}y_{ij}\ln\hat{y}_{ij})
$$
將代價函數視為參數$\Omega$的函數$J_{\Omega}$,這就是我們要優化的目標。

使用梯度下降求解目標函數極小值

由鏈式法則可知,\begin{equation}
\frac{\partial J_\Omega}{\partial \omega_{pj}} = \sum_{i=1}^{m} \frac{\partial J_\Omega}{\partial z_{ij}}\frac{\partial z_{ij}}{\partial \omega_{pj}}
\end{equation}

\begin{equation}
\frac{\partial J_\Omega}{\partial z_{ip}}=\frac{\partial \sum_{q=0}^{m}(-\sum_{j=1}^{k}\ln\hat{y}_{qj})}{\partial z_{ip}}= -\sum_{j=1}^{k}\frac{{y}_{ij}}{\hat{y}_{ij}}\frac{\partial\hat{y}_{ij}}{\partial z_{ip}}
\end{equation}
由於
\begin{equation}
\frac{\partial\hat{y}_{ij}}{\partial z_{ip}}=\left\{
\begin{aligned}
& =\frac{e^{z_{ij}}}{\sum_{q=1}^{k}e^{z_{iq}}}-\frac{e^{z_{ij}}e^{z_{ip}}}{(\sum_{q=1}^{k}e^{z_{iq}})^2}=\hat{y}_{ip}-\hat{y}_{ip}^2 &j=p \\
& =-\frac{e^{z_{ij}}e^{z_{ip}}}{(\sum_{q=1}^{k}e^{z_{iq}})^2}=-\hat{y}_{ij}\hat{y_ip} &j\neq p \\
\end{aligned}
\right.
\end{equation}
將(3)式帶入(2)式,由於$\sum_{j=1}^{k}y_{ij}=1$,有
\begin{equation}
\frac{\partial J_\Omega}{\partial z_{ip}}=\hat{y}_{ip}-y_{ip}
\end{equation}
考慮$z_{ip}=\sum_{q=0}^{n}x_{iq}\omega_{qp}$,並將(4)式帶入(1)式,得到:
$$
\frac{\partial J_\Omega}{\partial \omega_{pj}}=\sum_{i=1}^{m}\frac{\partial J_\Omega}{\partial z_{ij}}x_{ip}=\sum_{i=1}^{m}(\hat{y}_{ij}-y_{ij})x_{ip}
$$
寫回矩陣的形式,有:
$$
\nabla J_\Omega = \left[
\begin{matrix}
\frac{J_\Omega}{\omega_{01}} &\frac{J_\Omega}{\omega_{02}} & \cdots & \frac{J_\Omega}{\omega_{0k}} \\
\frac{J_\Omega}{\omega_{11}} &\frac{J_\Omega}{\omega_{12}} & \cdots & \frac{J_\Omega}{\omega_{1k}} \\
\vdots & \vdots & \ddots &\vdots \\
\frac{J_\Omega}{\omega_{n1}} &\frac{J_\Omega}{\omega_{n2}} & \cdots & \frac{J_\Omega}{\omega_{nk}} \\
\end{matrix}
\right]=\left[
\begin{matrix}
\sum_{i=1}^{m}x_{i0}(\hat{y}_{i1}-y_{i1}) & \sum_{i=1}^{m}x_{i0}(\hat{y}_{i2}-y_{i2}) & \cdots & \sum_{i=1}^{m}x_{i0}(\hat{y}_{ik}-y_{ik})\\
\sum_{i=1}^{m}x_{i1}(\hat{y}_{i1}-y_{i1}) & \sum_{i=1}^{m}x_{i1}(\hat{y}_{i2}-y_{i2}) & \cdots & \sum_{i=1}^{m}x_{i1}(\hat{y}_{ik}-y_{ik})\\
\vdots & \vdots & \ddots & \cdots \\
\sum_{i=1}^{m}x_{in}(\hat{y}_{i1}-y_{i1}) & \sum_{i=1}^{m}x_{in}(\hat{y}_{i2}-y_{i2}) & \cdots & \sum_{i=1}^{m}x_{in}(\hat{y}_{ik}-y_{ik})\\
\end{matrix}
\right]
$$
梯度已經求出來了,指定步長使用梯度下降方法求解即可。

 

 代碼如下。此文檔的latex文件在這里

import numpy as np
import matplotlib.pyplot as plt
##使用iris數據作為測試數據,需要將數據文件'iris.data'放置在此文件的目錄下
iris = []
target = []
with open('iris.data') as f:
    for line in f.readlines():
        iris.append(line.strip().split(',')[0:4])
        target.append(['Iris-setosa'==line.strip().split(',')[4],
                       'Iris-versicolor'==line.strip().split(',')[4],'Iris-virginica'==line.strip().split(',')[4]])
iris = np.array(iris).astype(float)
target=np.array(target)

def softmax(x_train,y_train):
    cost_trend = []
    alpha = 3*10**(-3)
    max_iter = 3*10**4
    tol = 0.05
    
    x_train = np.hstack((np.ones(x_train.shape[0]).reshape(x_train.shape[0],1),x_train))
    M,N = x_train.shape
    K = y_train.shape[1]
    omg = np.random.rand(N*K).reshape(N,K)
    for i in range(max_iter):
        grad = x_train.T.dot(np.exp(x_train@omg)/(np.exp(x_train@omg).sum(axis=1)).reshape(M,1) - y_train)
        omg -= alpha*grad
        cost = -(np.log(np.exp(x_train@omg) / (np.exp(x_train@omg).sum(axis=1).reshape(M,1))) * y_train).sum()
        
        if i in range(0,max_iter,200):
            cost_trend.append([i,cost])

        if cost/M <tol:
            return omg,cost,cost_trend
    print('達到最大迭代步數,但模型尚未收斂到指定精度')    
    return omg,cost,cost_trend
def pred(x,omg):
    x = np.hstack((np.ones(x.shape[0]).reshape(x.shape[0],1),x))
    return np.exp(x@omg)/np.exp(x@omg).sum(axis=1).reshape(x.shape[0],1)
omg,meanerror,error = softmax(iris,target)
pred = pred(iris,omg)
print('模型在測試數據上的錯誤率為{:.2f}%'.format(float(sum(abs(pred.argmax(axis=1)-target.argmax(axis=1)))/150)*100)) 
import matplotlib.pyplot as plt
plt.plot([item[0] for item in error[2:]],[item[1]for item in error[2:]])
plt.title('cost-iteration')

 結果如下圖:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM