Comenzaré a hacer una lista de las que he aprendido hasta ahora. Como dijo @marcodena, los pros y los contras son más difíciles porque en su mayoría son solo heurísticas aprendidas al probar estas cosas, pero me imagino que al menos tengo una lista de lo que no pueden dañar.
Primero, definiré la notación explícitamente para que no haya confusión:
Notación
Esta notación es del libro de Neilsen .
Una red neuronal Feedforward es muchas capas de neuronas conectadas entre sí. Toma una entrada, luego esa entrada "gotea" a través de la red y la red neuronal devuelve un vector de salida.
Más formalmente, llame la activación (también conocida como salida) de la neurona en la capa , donde es el elemento en el vector de entrada. j t h i t h a 1 j j t haijjthitha1jjth
Entonces podemos relacionar la entrada de la siguiente capa con la anterior a través de la siguiente relación:
aij=σ(∑k(wijk⋅ai−1k)+bij)
dónde
- σ es la función de activación,
- k t h ( i - 1 ) t h j t h i t hwijk es el peso desde la neurona en la capa hasta la neurona en la capa ,kth(i−1)thjthith
- j t h i t hbij es el sesgo de la neurona en la capa , yjthith
- j t h i t haij representa el valor de activación de la neurona en la capa .jthith
A veces escribimos para representar , en otras palabras, el valor de activación de una neurona antes de aplicar la función de activación . ∑ k ( w i j k ⋅ a i - 1 k ) + b i jzij∑k(wijk⋅ai−1k)+bij
Para una notación más concisa podemos escribir
ai=σ(wi×ai−1+bi)
Para usar esta fórmula para calcular la salida de una red de alimentación directa para alguna entrada , establezca , luego calcule , donde es el número de capas.a 1 = I a 2 , a 3 , ... , a m mI∈Rna1=Ia2,a3,…,amm
Funciones de activacion
(a continuación, escribiremos lugar de para facilitar la lectura)e xexp(x)ex
Identidad
También conocido como una función de activación lineal.
aij=σ(zij)=zij
Paso
aij=σ(zij)={01if zij<0if zij>0
Lineal a trozos
Elija algunos y , que es nuestro "rango". Todo lo que sea menor que este rango será 0, y todo lo que sea mayor que este rango será 1. Cualquier otra cosa se interpola linealmente. Formalmente:xminxmax
aij=σ(zij)=⎧⎩⎨⎪⎪⎪⎪0mzij+b1if zij<xminif xmin≤zij≤xmaxif zij>xmax
Dónde
m=1xmax−xmin
y
b=−mxmin=1−mxmax
Sigmoideo
aij=σ(zij)=11+exp(−zij)
Log-log complementario
aij=σ(zij)=1−exp(−exp(zij))
Bipolar
aij=σ(zij)={−1 1if zij<0if zij>0
Sigmoide bipolar
aij=σ(zij)=1−exp(−zij)1+exp(−zij)
Tanh
aij=σ(zij)=tanh(zij)
Tanh de LeCun
Ver Backprop eficiente .
aij=σ(zij)=1.7159tanh(23zij)
Escamoso:
Tanh duro
aij=σ(zij)=max(−1,min(1,zij))
Absoluto
aij=σ(zij)=∣zij∣
Rectificador
También conocido como Unidad lineal rectificada (ReLU), Max o la función de rampa .
aij=σ(zij)=max(0,zij)
Modificaciones de ReLU
Estas son algunas funciones de activación con las que he estado jugando que parecen tener un muy buen rendimiento para MNIST por razones misteriosas.
aij=σ(zij)=max(0,zij)+cos(zij)
Escamoso:
aij=σ(zij)=max(0,zij)+sin(zij)
Escamoso:
Rectificador liso
También conocido como Unidad lineal rectificada suave, Max suave o Soft plus
aij=σ(zij)=log(1+exp(zij))
Logit
aij=σ(zij)=log(zij(1−zij))
Escamoso:
Probit
aij=σ(zij)=2–√erf−1(2zij−1)
.
Donde es la función de error . No se puede describir a través de funciones elementales, pero puede encontrar formas de aproximar su inverso en esa página de Wikipedia y aquí .erf
Alternativamente, se puede expresar como
aij=σ(zij)=ϕ(zij)
.
Donde es la función de distribución acumulativa (CDF). Vea aquí los medios para aproximar esto.ϕ
Escamoso:
Coseno
Ver fregaderos de cocina al azar .
aij=σ(zij)=cos(zij)
.
Softmax
También conocido como el exponencial normalizado.
aij=exp(zij)∑kexp(zik)
Este es un poco extraño porque la salida de una sola neurona depende de las otras neuronas en esa capa. También se vuelve difícil de calcular, ya que puede ser un valor muy alto, en cuyo caso probablemente se desbordará. Del mismo modo, si es un valor muy bajo, se desbordará y se convertirá en .zijexp(zij)zij0
Para combatir esto, calcularemos en su lugar . Esto nos da:log(aij)
log(aij)=log⎛⎝⎜exp(zij)∑kexp(zik)⎞⎠⎟
log(aij)=zij−log(∑kexp(zik))
Aquí necesitamos usar el truco log-sum-exp :
Digamos que estamos computando:
log(e2+e9+e11+e−7+e−2+e5)
Primero ordenaremos nuestros exponenciales por magnitud por conveniencia:
log(e11+e9+e5+e2+e−2+e−7)
Entonces, dado que es nuestro más alto, multiplicamos por :e11e−11e−11
log(e−11e−11(e11+e9+e5+e2+e−2+e−7))
log(1e−11(e0+e−2+e−6+e−9+e−13+e−18))
log(e11(e0+e−2+e−6+e−9+e−13+e−18))
log(e11)+log(e0+e−2+e−6+e−9+e−13+e−18)
11+log(e0+e−2+e−6+e−9+e−13+e−18)
Entonces podemos calcular la expresión a la derecha y tomar el registro de la misma. Está bien hacer esto porque esa suma es muy pequeña con respecto a , por lo que cualquier flujo inferior a 0 no habría sido lo suficientemente significativo como para marcar la diferencia de todos modos. El desbordamiento no puede suceder en la expresión de la derecha porque estamos garantizados que después de multiplicar por , todas las potencias serán .log(e11)e−11≤0
Formalmente, llamamos . Entonces:m=max(zi1,zi2,zi3,...)
log(∑kexp(zik))=m+log(∑kexp(zik−m))
Nuestra función softmax se convierte en:
aij=exp(log(aij))=exp(zij−m−log(∑kexp(zik−m)))
También como nota al margen, la derivada de la función softmax es:
dσ(zij)dzij=σ′(zij)=σ(zij)(1−σ(zij))
Máximo fuera
Este también es un poco complicado. Esencialmente, la idea es dividir cada neurona en nuestra capa máxima en muchas sub-neuronas, cada una de las cuales tiene sus propios pesos y sesgos. Luego, la entrada a una neurona va a cada una de sus sub-neuronas, y cada sub-neurona simplemente emite sus 's (sin aplicar ninguna función de activación). El de esa neurona es entonces el máximo de todas las salidas de su sub-neurona.zaij
Formalmente, en una sola neurona, digamos que tenemos sub-neuronas. Entoncesn
aij=maxk∈[1,n]sijk
dónde
sijk=ai−1∙wijk+bijk
( es el producto punto )∙
Para ayudarnos a pensar en esto, considere la matriz de peso para la capa de una red neuronal que utiliza, por ejemplo, una función de activación sigmoidea. es una matriz 2D, donde cada columna es un vector para la neurona contiene un peso para cada neurona en la capa anterior .WiithWiWijji−1
Si vamos a tener sub-neuronas, vamos a necesitar una matriz de peso 2D para cada neurona, ya que cada sub-neurona necesitará un vector que contenga un peso para cada neurona en la capa anterior. Esto significa que es ahora una matriz de peso 3D, donde cada es la matriz de peso 2D para una sola neurona . Y luego es un vector para la sub-neurona en la neurona que contiene un peso para cada neurona en la capa anterior .WiWijjWijkkji−1
Del mismo modo, en una red neuronal que nuevamente utiliza, por ejemplo, una función de activación sigmoidea, es un vector con un sesgo para cada neurona en la capa .bibijji
Para hacer esto con sub-neuronas, necesitamos una matriz de sesgo 2D para cada capa , donde es el vector con un sesgo para cada subneuron en neurona.biibijbijkkjth
Tener una matriz de peso y un vector de sesgo para cada neurona luego deja muy claras las expresiones anteriores, simplemente aplica los pesos de cada sub-neurona a las salidas de capa , luego aplicando sus sesgos y tomando el máximo de ellos.wijbijwijkai−1i−1bijk
Redes de funciones de base radial
Las redes de función de base radial son una modificación de las redes neuronales de alimentación directa, donde en lugar de usar
aij=σ(∑k(wijk⋅ai−1k)+bij)
tenemos un peso por nodo en la capa anterior (como es normal), y también un vector medio y un vector de desviación estándar para cada nodo en La capa anterior.wijkkμijkσijk
Luego llamamos a nuestra función de activación para evitar confundirla con los vectores de desviación estándar . Ahora, para calcular , primero tenemos que calcular una para cada nodo en la capa anterior. Una opción es usar la distancia euclidiana:ρσijkaijzijk
zijk=∥(ai−1−μijk∥−−−−−−−−−−−√=∑ℓ(ai−1ℓ−μijkℓ)2−−−−−−−−−−−−−√
Donde es el elemento de . Este no usa . Alternativamente, hay una distancia de Mahalanobis, que supuestamente funciona mejor:μijkℓℓthμijkσijk
zijk=(ai−1−μijk)TΣijk(ai−1−μijk)−−−−−−−−−−−−−−−−−−−−−−√
donde es la matriz de covarianza , definida como:Σijk
Σijk=diag(σijk)
En otras palabras, es la matriz diagonal con como elementos diagonales. Aquí definimos y como vectores de columna porque esa es la notación que normalmente se usa.Σijkσijkai−1μijk
En realidad, esto solo dice que la distancia de Mahalanobis se define como
zijk=∑ℓ(ai−1ℓ−μijkℓ)2σijkℓ−−−−−−−−−−−−−−⎷
Donde es el elemento de . Tenga en cuenta que siempre debe ser positivo, pero este es un requisito típico para la desviación estándar, por lo que esto no es tan sorprendente.σijkℓℓthσijkσijkℓ
Si lo desea, la distancia de Mahalanobis es lo suficientemente general como para que la matriz de covarianza pueda definirse como otras matrices. Por ejemplo, si la matriz de covarianza es la matriz de identidad, nuestra distancia de Mahalanobis se reduce a la distancia euclidiana. embargo, es bastante común y se conoce como distancia euclidiana normalizada .ΣijkΣijk=diag(σijk)
De cualquier manera, una vez que se ha elegido nuestra función de distancia, podemos calcular través deaij
aij=∑kwijkρ(zijk)
En estas redes, eligen multiplicar por pesos después de aplicar la función de activación por razones.
Esto describe cómo hacer una red de función de base radial de múltiples capas, sin embargo, generalmente solo hay una de estas neuronas, y su salida es la salida de la red. Se dibuja como múltiples neuronas porque cada vector medio y cada vector de desviación estándar de esa neurona individual se considera una "neurona" y luego, después de todas estas salidas, hay otra capa que toma la suma de esos valores calculados por los pesos, al igual que arriba. Dividirlo en dos capas con un vector "sumador" al final me parece extraño, pero es lo que hacen. σ i j k a i jμijkσijkaij
Ver también aquí .
Función de base radial Funciones de activación de red
Gaussiano
ρ(zijk)=exp(−12(zijk)2)
Multicuadrático
Elige algún punto . Luego calculamos la distancia desde a :( z i j , 0 )(x,y)(zij,0)(x,y)
ρ(zijk)=(zijk−x)2+y2−−−−−−−−−−−−√
Esto es de Wikipedia . No está limitado y puede ser cualquier valor positivo, aunque me pregunto si hay una manera de normalizarlo.
Cuando , esto es equivalente a absoluto (con un desplazamiento horizontal ).y=0x
Multiquadratic inverso
Igual que cuadrático, excepto volteado:
ρ(zijk)=1(zijk−x)2+y2−−−−−−−−−−−−√
* Gráficos de los gráficos de intmath usando SVG .