Word2Vec介绍:softmax函数的python实现
由iquant创建,最终由qxiao 被浏览 10 用户
1. 什么是Softmax
Softmax要解决这样一个问题:我有一个向量,想用数学方法把向量中的所有元素归一化为一个概率分布。也就是说,该向量中的元素在[0,1]范围内,且所有元素的和为1。
Softmax就是这个数学方法,本质上是一个函数。
假设我们有一个k维向量z,我们想把它转换为一个k维向量 ,使其所有元素的范围是[0,1]且所有元素的和为1,函数表达式是:
也就是说, 内的每一个元素是对z内的对应元素求指数,再除以所有元素求指数后的和。所以Softmax函数也叫做归一化指数函数(normalized exponential function)。
2. Softmax用在哪里?
在“Word2Vec介绍:“自然语言处理(NLP)+深度学习”简介”文章中,介绍了生成词向量(word vector)的方法,在文章中,我们介绍了连续袋模型 (Continuous Bag of Words Model (CBOW)),该模型的方法的第五步就是将得到的“得分”转换为概率,其中用到的函数就是Softmax。当然,Softmax还有很多应用,只要抓住该函数的本质:转换为概率分布。
3. Softmax的性质
对输入x加上一个实数c后求softmax结果不变。
用公式表示就是:
,其中c是实数
这个性质的证明比较简单,读者可以自行证明。
4. Softmax的Python实现
import numpy as np
def softmax(x):
"""
对输入x的每一行计算softmax。
该函数对于输入是向量(将向量视为单独的行)或者矩阵(M x N)均适用。
代码利用softmax函数的性质: softmax(x) = softmax(x + c)
参数:
x -- 一个N维向量,或者M x N维numpy矩阵.
返回值:
x -- 在函数内部处理后的x
"""
orig_shape = x.shape
# 根据输入类型是矩阵还是向量分别计算softmax
if len(x.shape) > 1:
# 矩阵
tmp = np.max(x,axis=1) # 得到每行的最大值,用于缩放每行的元素,避免溢出
x -= tmp.reshape((x.shape[0],1)) # 利用性质缩放元素
x = np.exp(x) # 计算所有值的指数
tmp = np.sum(x, axis = 1) # 每行求和
x /= tmp.reshape((x.shape[0], 1)) # 求softmax
else:
# 向量
tmp = np.max(x) # 得到最大值
x -= tmp # 利用最大值缩放数据
x = np.exp(x) # 对所有元素求指数
tmp = np.sum(x) # 求元素和
x /= tmp # 求somftmax
return x
5. softmax测试
使用以下向量来测试:
test1 = np.array([1, 2, 3, 4])
print('原始向量:',test1)
print('经过softmax后:',softmax(test1))
得到结果如下:
原始向量: [1 2 3 4]
经过softmax后: [ 0.0320586 0.08714432 0.23688282 0.64391426]
\