
В приведенном ниже MSE я определяю функцию logsumexp
, которая [declare function={logsumexp(\x)=\log(\sum{\exp^{\x_i}});}]
поможет построить график функции активации softmax.
Когда я использовал функцию добавления сюжета, \addplot[blue,smooth] {exp(x) /logsumexp(x))};
все испортилось.
MSE: ( \addplot
строка закомментирована для функции softmax)
\documentclass[11pt]{article}
\usepackage{subfigure}
\usepackage{pgfplots}
\usepackage[top=3cm,left=3cm,right=3cm,bottom=3cm]{geometry}
% Scriptsize axis style.
\pgfplotsset{every axis/.append style={tick label style={/pgf/number format/fixed},font=\scriptsize,ylabel near ticks,xlabel near ticks,grid=major}}
\pgfplotsset{compat=1.16}
\begin{document}
\begin{figure}[t!]
\centering
\subfigure[sigmoid activation function.]{
\begin{tikzpicture}[declare function={sigma(\x)=1/(1+exp(-\x));}]
\begin{axis}[width=5.5cm,height=6cm,ylabel=$\sigma(z)$,xlabel=$z$,ymin=0,ymax=1.25,xmin=-5,xmax=5]
\addplot[blue,smooth] {1/(1+exp(-x))};
\end{axis}
\end{tikzpicture}
}
\subfigure[Softmax activation function. ]{
\begin{tikzpicture}[declare function={logsumexp(\x)=\log(\sum{\exp^{\x_i}});}]
\begin{axis}[width=5.5cm,height=6cm,ylabel=$ \sigma(z)_j$,xlabel=$z$,ymin=-1.25,ymax=1.25,xmin=-5,xmax=5]
%\addplot[blue,smooth] {exp(x) /logsumexp(x))};
\end{axis}
\end{tikzpicture}
}
\caption[Activation functions.]{Sigmoid and Softmax activation functions}
\label{fig:sigmoid-tanh}
\end{figure}
logsumexp function: $logsumexp(x)=\log(\sum{\exp^{x_i}})$
\end{document}
когда \addplot в некомментированном виде, все перепутано. Что я упускаю?
Check that your $'s match around math expressions. If they do, then you've probably used a symbol in normal text that needs to be in math mode. Symbols such as subscripts ( _ ), integrals ( \int ), Greek letters ( \alpha, \beta, \delta ), and modifiers (\vec{x}, \tilde{x} ) must be written in math mode. See the full list here.If you intended to use mathematics mode, then use $ … $ for 'inline math mode', $$ … $$ for 'display math mode' or alternatively \begin{math} … \end{math}.
РЕДАКТИРОВАТЬ
Приведем пример с некоторыми значениями для x
.
import numpy as np
x = [1.2, 2.5, 3.1, 4.4, 1.6, 2.4, 3.6]
np.exp(x) / np.sum(np.exp(x))
array([0.01933382, 0.07094152, 0.12926387, 0.47430749, 0.02884267,
0.06419054, 0.21312009])
решение1
Что касается вашего вопроса, как уже упоминалось в комментариях, \exp
есть \log
команды, которыенабранныйэти функции, вы, вероятно, захотите использовать встроенные функции exp
и ln
вместо них. Аналогично, \sum
это команда, которая набирает символ суммы, но в отличие от предыдущих случаев, встроенной функции нет. Поэтому ее нужно построить. Ниже приведен пример. (Если это не та точная функция, которая вам нужна, вы хотите предоставить точное объяснение, которое определяет функцию в общих терминах, т. е. с использованием математического языка, а не какого-то кода Python.)
\documentclass[11pt]{article}
\usepackage[top=3cm,left=3cm,right=3cm,bottom=3cm]{geometry}
\usepackage{amsmath}
\DeclareMathOperator{\logsumexp}{logsumexp}
\usepackage{subcaption}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}
\pgfplotsset{every axis/.append style={tick label style={/pgf/number format/fixed},font=\scriptsize,ylabel near ticks,xlabel near ticks,grid=major}}
\pgfmathdeclarefunction{sumexp}{3}{%
\begingroup%
\pgfkeys{/pgf/fpu,/pgf/fpu/output format=fixed}%
\pgfmathsetmacro{\myx}{#1}%
\pgfmathtruncatemacro{\myxmin}{#2}%
\pgfmathtruncatemacro{\myxmax}{#3}%
\pgfmathsetmacro{\mysum}{0}%
\pgfplotsforeachungrouped\XX in {\myxmin,...,\myxmax}%
{\pgfmathsetmacro{\mysum}{\mysum+exp(\XX)}}%
\pgfmathparse{\mysum+exp(#1)}%
\pgfmathsmuggle\pgfmathresult\endgroup%
}%
\begin{document}
\begin{figure}[t!]
\centering
\begin{subfigure}[t]{0.45\textwidth}
\begin{tikzpicture}[declare function={sigma(\x)=1/(1+exp(-\x));}]
\begin{axis}[width=5.5cm,height=6cm,ylabel=$\sigma(z)$,xlabel=$z$,ymin=0,ymax=1.25,xmin=-5,xmax=5]
\addplot[blue,smooth] {1/(1+exp(-x))};
\end{axis}
\end{tikzpicture}
\caption{Sigmoid activation function.}
\end{subfigure}
\begin{subfigure}[t]{0.45\textwidth}
\begin{tikzpicture}
\begin{axis}[width=5.5cm,height=6cm,ylabel=$\sigma(z)_j$,
xlabel=$z$, xmin=-5,xmax=5]
\addplot[blue,domain=-5:5,samples=51]
{exp(x)/sumexp(x,-4,0)};
\end{axis}
\end{tikzpicture}
\caption{Softmax activation function.}
\end{subfigure}
\caption[Activation functions.]{Sigmoid and Softmax activation functions}
\label{fig:sigmoid-tanh}
\end{figure}
\end{document}
решение2
%for Softmax function, place this command before \begin{document}.
\pgfmathdeclarefunction{sumexp}{3}{%
\begingroup%
\pgfkeys{/pgf/fpu}% "/pgf/fpu/output format=fixed" removed
\pgfmathsetmacro{\myx}{#1}%
\pgfmathtruncatemacro{\myxmin}{#2}%
\pgfmathtruncatemacro{\myxmax}{#3}%
\pgfmathsetmacro{\mysum}{0}%
\pgfplotsforeachungrouped\XX in {\myxmin,...,\myxmax}%
{\pgfmathsetmacro{\mysum}{\mysum+exp(\XX)}}%
\pgfmathparse{\mysum+exp(#1)}%
\pgfmathfloattofixed\pgfmathresult% added
\pgfmathsmuggle\pgfmathresult\endgroup%
}%
После определения приведенного выше sumexp можно использовать команду sumexp для построения графика функций активации Softmax.
\begin{figure}
\centering
\begin{tikzpicture}[declare function=
{Softmax(\x)=exp(x)/sumexp(x,-5,0);}]
\begin{axis}%
[
xlabel = $x$,
ylabel = $y$,
%grid=major,
xmin=-5,
xmax=5,
axis x line=middle,
ymax=1, samples=100,
axis y line=middle,
domain=-5:5}
]
\addplot[blue] {Softmax(x)};
\end{axis}
\end{tikzpicture}
\caption{Softmax Function}
\label{fig:softmax_function}
\end{figure}
Вы получите следующий результат:
Я знаю, что изображение может не совсем подходить, но сетка, цвет и т. д. могут быть выбраны вами. Надеюсь, это поможет.