摘要:函數(shù)將任意維的實(shí)值向量轉(zhuǎn)換為取值范圍在之間的維實(shí)值向量,并且總和為。將原始輸入映射到區(qū)間,并且總和為,常用于表征概率。這個(gè)性質(zhì)用于保證數(shù)值的穩(wěn)定性。當(dāng)輸入一個(gè)較大的數(shù)值時(shí),函數(shù)將會(huì)超出限制,導(dǎo)致出錯(cuò)。
Softmax
softmax函數(shù)將任意n維的實(shí)值向量轉(zhuǎn)換為取值范圍在(0,1)之間的n維實(shí)值向量,并且總和為1。
例如:向量softmax([1.0, 2.0, 3.0]) ------> [0.09003057, 0.24472847, 0.66524096]
性質(zhì):
因?yàn)閟oftmax是單調(diào)遞增函數(shù),因此不改變?cè)紨?shù)據(jù)的大小順序。
將原始輸入映射到(0,1)區(qū)間,并且總和為1,常用于表征概率。
softmax(x) = softmax(x+c), 這個(gè)性質(zhì)用于保證數(shù)值的穩(wěn)定性。
softmax的實(shí)現(xiàn)及數(shù)值穩(wěn)定性一個(gè)最簡(jiǎn)單的計(jì)算給定向量的softmax的實(shí)現(xiàn)如下:
import numpy as np def softmax(x): """Compute the softmax of vector x.""" exp_x = np.exp(x) softmax_x = exp_x / np.sum(exp_x) return softmax_x
讓我們來測(cè)試一下上面的代碼:
softmax([1, 2, 3]) array([0.09003057, 0.24472847, 0.66524096])
但是,當(dāng)我們嘗試輸入一個(gè)比較大的數(shù)值向量時(shí),就會(huì)出錯(cuò):
softmax([1000, 2000, 3000]) array([nan, nan, nan])
這是由numpy中的浮點(diǎn)型數(shù)值范圍限制所導(dǎo)致的。當(dāng)輸入一個(gè)較大的數(shù)值時(shí),sofmax函數(shù)將會(huì)超出限制,導(dǎo)致出錯(cuò)。
為了解決這一問題,這時(shí)我們就能用到sofmax的第三個(gè)性質(zhì),即:softmax(x) = softmax(x+c),
一般在實(shí)際運(yùn)用中,通常設(shè)定c = - max(x)。
接下來,我們重新定義softmax函數(shù):
import numpy as np def softmax(x): """Compute the softmax in a numerically stable way.""" x = x - np.max(x) exp_x = np.exp(x) softmax_x = exp_x / np.sum(exp_x) return softmax_x
然后再次測(cè)試一下:
softmax([1000, 2000, 3000]) array([ 0., 0., 1.])
Done!
以上都是基于向量上的softmax實(shí)現(xiàn),下面提供了基于向量以及矩陣的softmax實(shí)現(xiàn),代碼如下:
import numpy as np def softmax(x): """ Compute the softmax function for each row of the input x. Arguments: x -- A N dimensional vector or M x N dimensional numpy matrix. Return: x -- You are allowed to modify x in-place """ orig_shape = x.shape if len(x.shape) > 1: # Matrix exp_minmax = lambda x: np.exp(x - np.max(x)) denom = lambda x: 1.0 / np.sum(x) x = np.apply_along_axis(exp_minmax,1,x) denominator = np.apply_along_axis(denom,1,x) if len(denominator.shape) == 1: denominator = denominator.reshape((denominator.shape[0],1)) x = x * denominator else: # Vector x_max = np.max(x) x = x - x_max numerator = np.exp(x) denominator = 1.0 / np.sum(numerator) x = numerator.dot(denominator) assert x.shape == orig_shape return x
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/38689.html
摘要:首先需要添加一個(gè)新的占位符用于輸入正確值計(jì)算交叉熵的表達(dá)式可以實(shí)現(xiàn)為現(xiàn)在我們知道我們需要我們的模型做什么啦,用來訓(xùn)練它是非常容易的。 學(xué)習(xí)softmax回歸模型 一. 下載mnist數(shù)據(jù)集 新建一個(gè)download.py 代碼如下: Functions for downloading and reading MNIST data. from __future__ import abso...
摘要:經(jīng)過第一步的處理已經(jīng)把古詩(shī)詞詞語轉(zhuǎn)換為可以機(jī)器學(xué)習(xí)建模的數(shù)字形式,因?yàn)槲覀儾捎盟惴ㄟM(jìn)行古詩(shī)詞生成,所以還需要構(gòu)建輸入到輸出的映射處理。 LSTM 介紹 序列化數(shù)據(jù)即每個(gè)樣本和它之前的樣本存在關(guān)聯(lián),前一數(shù)據(jù)和后一個(gè)數(shù)據(jù)有順序關(guān)系。深度學(xué)習(xí)中有一個(gè)重要的分支是專門用來處理這樣的數(shù)據(jù)的——循環(huán)神經(jīng)網(wǎng)絡(luò)。循環(huán)神經(jīng)網(wǎng)絡(luò)廣泛應(yīng)用在自然語言處理領(lǐng)域(NLP),今天我們帶你從一個(gè)實(shí)際的例子出發(fā),介紹循...
閱讀 1390·2021-09-22 10:02
閱讀 1914·2021-09-08 09:35
閱讀 4064·2021-08-12 13:29
閱讀 2610·2019-08-30 15:55
閱讀 2265·2019-08-30 15:53
閱讀 2304·2019-08-29 17:13
閱讀 2765·2019-08-29 16:31
閱讀 2957·2019-08-29 12:24