
No MSE abaixo, defino uma função logsumexp
para [declare function={logsumexp(\x)=\log(\sum{\exp^{\x_i}});}]
ajudar na plotagem da função de ativação softmax.
Quando usei a função, para adicionar plot \addplot[blue,smooth] {exp(x) /logsumexp(x))};
tudo estragou.
MSE: ( \addplot
linha comentada para a função 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}
quando \addplot é descomentado, tudo bagunçado. o que estou perdendo?
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}.
EDITAR
Dando um exemplo com alguns valores para 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])
Responder1
Quanto à sua pergunta, conforme mencionado nos comentários, \exp
são \log
comandos queformatadoessas funções, você provavelmente desejará usar as funções integradas exp
e ln
, em vez disso. Da mesma forma, \sum
é um comando que digita um símbolo de soma, mas ao contrário dos casos anteriores, não há nenhuma função integrada. Então é preciso construí-lo. O seguinte contém um exemplo. (Se essa não for a função exata que você deseja, forneça uma explicação precisa que defina a função em termos comuns, ou seja, usando uma linguagem matemática e não algum código 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}
Responder2
%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%
}%
Depois de definir o sumexp acima, você pode usar o comando sumexp para traçar as funções de ativação do 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}
Você obterá a seguinte saída:
Eu sei que a imagem pode não ser perfeitamente adequada, mas a grade, a cor, etc., podem ser sua escolha. Eu espero que isso ajude.