AI量化知识树

Word2Vec介绍:softmax函数的python实现

由iquant创建,最终由qxiao 被浏览 10 用户

1. 什么是Softmax

Softmax要解决这样一个问题:我有一个向量,想用数学方法把向量中的所有元素归一化为一个概率分布。也就是说,该向量中的元素在[0,1]范围内,且所有元素的和为1。

Softmax就是这个数学方法,本质上是一个函数。

假设我们有一个k维向量z,我们想把它转换为一个k维向量 sigma(z) ,使其所有元素的范围是[0,1]且所有元素的和为1,函数表达式是:

softmax(x)_i = frac {e^{x_i}}{sum _j e^{x_j}}

也就是说, sigma(x) 内的每一个元素是对z内的对应元素求指数,再除以所有元素求指数后的和。所以Softmax函数也叫做归一化指数函数(normalized exponential function)。

2. Softmax用在哪里?

“Word2Vec介绍:“自然语言处理(NLP)+深度学习”简介”文章中,介绍了生成词向量(word vector)的方法,在文章中,我们介绍了连续袋模型 (Continuous Bag of Words Model (CBOW)),该模型的方法的第五步就是将得到的“得分”转换为概率,其中用到的函数就是Softmax。当然,Softmax还有很多应用,只要抓住该函数的本质:转换为概率分布。

3. Softmax的性质

对输入x加上一个实数c后求softmax结果不变。

用公式表示就是:

softmax(x)=softmax(x+c) ,其中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]

\

标签

函数Softmax函数机器学习算法自然语言处理风险评估
{link}