Get the App
SLTechnology News&Howtos  ›  Development  › 

How to implement softmax function in C++

Shulou Source: shulou.com Published: 2022-05-31 16:49:15 09月21日 Update

本篇内容主要讲解"C++怎么实现softmax函数",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"C++怎么实现softmax函数"吧!

背景

今天面试字节算法岗时被问到的问题,让我用C++实现一个softmax函数。softmax是逻辑回归在多分类问题上的推广。大概的公式如下:

即判断该变量在总体变量中的占比。

第一次实现实现

我们用vector来封装输入和输出,简单的按公式复现。

vector softmax(vector input){ double total=0; for(auto x:input) { total+=exp(x); } vector result; for(auto x:input) { result.push_back(exp(x)/total); } return result;}测试test 1

测试用例1: {1, 2, 3, 4, 5}

测试输出1: {0.0116562, 0.0316849, 0.0861285, 0.234122, 0.636409}

经过简单测试是正常的。

test 2

但是这时面试官提出了一个问题,即如果有较大输入变量时会怎么样?

测试用例2: {1, 2, 3, 4, 5, 1000}

测试输出2: {0, 0, 0, 0, 0, nan}

由于 e^1000已经溢出了双精度浮点(double)所能表示的范围,所以变成了NaN(not a number)。

第二次实现(改进)改进原理

我们注意观察softmax的公式:

如果我们给上下同时乘以一个很小的数,最后答案的值是不变的。

那我们可以给每一个输入 x i 都减去一个值 a ,防止爆精度。

大致表示如下:

实现vector softmax(vector input){ double total=0; double MAX=input[0]; for(auto x:input) { MAX=max(x,MAX); } for(auto x:input) { total+=exp(x-MAX); } vector result; for(auto x:input) { result.push_back(exp(x-MAX)/total); } return result;}测试test 1

测试用例1: {1, 2, 3, 4, 5, 1000}

测试输出1: {0, 0, 0, 0, 0, 1}

test 2

测试用例1: {0, 19260817, 19260817}

测试输出1: {0, 0.5, 0.5}

我们发现结果正常了。

完整代码#include #include #include using namespace std;vector softmax(vector input){ double total=0; double MAX=input[0]; for(auto x:input) { MAX=max(x,MAX); } for(auto x:input) { total+=exp(x-MAX); } vector result; for(auto x:input) { result.push_back(exp(x-MAX)/total); } return result;}int main(int argc, char *argv[]){ int n; cin>>n; vector input; while(n--) { double x; cin>>x; input.push_back(x); } for(auto y:softmax(input)) { cout

Tags: Test output function Clippers formula variable problem input content precision learning practical deeper larger upper and lower code interest principle and at the same time byte Apple Docker Huawei Linux macOS MariaDB Microsoft MySQL NVidia OPPO Reno NVidia Linux Huawei macOS Shulou Information