Je vais commencer à dresser une liste de ceux que j'ai appris jusqu'à présent. Comme @marcodena l'a dit, le pour et le contre sont plus difficiles, car il ne s'agit que d'heuristiques apprises en essayant ces choses, mais je pense au moins que la liste de ce qu'elles sont ne peut pas nuire.
Premièrement, je vais définir explicitement la notation afin d'éviter toute confusion:
Notation
Cette notation est extraite du livre de Neilsen .
Un réseau de neurones Feedforward est constitué de plusieurs couches de neurones connectées entre elles. Il prend une entrée, puis cette entrée "passe" par le réseau et le réseau de neurones renvoie un vecteur de sortie.
Plus formellement, appelez l'activation (ou sortie) du neurone dans la couche , où est l' élément dans le vecteur d'entrée.aijjthitha1jjth
Ensuite, nous pouvons relier l'entrée de la couche suivante à la précédente via la relation suivante:
aij=σ(∑k(wijk⋅ai−1k)+bij)
où
- σ est la fonction d'activation,
- wijk est le poids de la neurone dans le couche à la neurone dans le couche,kth(i−1)thjthith
- bij est le biais du neurone dans la couche , etjthith
- aij représente la valeur d'activation du neurone dans la couche .jthith
Parfois, nous écrivons pour représenter , en d'autres termes, la valeur d'activation d'un neurone avant d'appliquer la fonction d'activation .zij∑k(wijk⋅ai−1k)+bij
Pour une notation plus concise, nous pouvons écrire
ai=σ(wi×ai−1+bi)
Pour utiliser cette formule pour calculer la sortie d’un réseau à anticipation pour une entrée , définissez , puis calculez , où est le nombre de couches.I∈Rna1=Ia2,a3,…,amm
Fonctions d'activation
(dans ce qui suit, nous écrirons au lieu de pour la lisibilité)exp(x)ex
Identité
Également appelée fonction d'activation linéaire.
aij=σ(zij)=zij
Étape
aij=σ(zij)={01if zij<0if zij>0
Par morceaux linéaire
Choisissez quelques et , qui sont notre "plage". Tout ce qui est inférieur à cette plage sera 0 et tout ce qui est supérieur à cette plage sera 1. Tout le reste est interpolé linéairement entre. Officiellement:xminxmax
aij=σ(zij)=⎧⎩⎨⎪⎪⎪⎪0mzij+b1if zij<xminif xmin≤zij≤xmaxif zij>xmax
Où
m=1xmax−xmin
et
b=−mxmin=1−mxmax
Sigmoïde
aij=σ(zij)=11+exp(−zij)
Journal de bord complémentaire
aij=σ(zij)=1−exp(−exp(zij))
Bipolaire
aij=σ(zij)={−1 1if zij<0if zij>0
Sigmoïde bipolaire
aij=σ(zij)=1−exp(−zij)1+exp(−zij)
Tanh
aij=σ(zij)=tanh(zij)
LeCun's Tanh
Voir Efficace Backprop .
aij=σ(zij)=1.7159tanh(23zij)
Escaladé:
Dur tanh
aij=σ(zij)=max(−1,min(1,zij))
Absolu
aij=σ(zij)=∣zij∣
Redresseur
Également connu sous le nom d'unité linéaire rectifiée (ReLU), Max ou fonction de rampe .
aij=σ(zij)=max(0,zij)
Modifications de ReLU
Voici quelques fonctions d'activation avec lesquelles je joue et qui semblent avoir de très bonnes performances pour MNIST pour des raisons mystérieuses.
aij=σ(zij)=max(0,zij)+cos(zij)
Escaladé:
aij=σ(zij)=max(0,zij)+sin(zij)
Escaladé:
Redresseur lisse
Également connu sous le nom d'unité linéaire rectifiée lisse, Smooth Max ou Soft plus
aij=σ(zij)=log(1+exp(zij))
Logit
aij=σ(zij)=log(zij(1−zij))
Escaladé:
Probit
aij=σ(zij)=2–√erf−1(2zij−1)
.
Où est la fonction d'erreur . Il ne peut pas être décrit via des fonctions élémentaires, mais vous pouvez trouver des moyens d’en approcher l’inverse sur cette page Wikipedia et ici .erf
Alternativement, il peut être exprimé par
aij=σ(zij)=ϕ(zij)
.
Où est la fonction de distribution cumulative (CDF). Voir ici pour les moyens de s'en approcher.ϕ
Escaladé:
Cosinus
Voir Évier de cuisine au hasard .
aij=σ(zij)=cos(zij)
.
Softmax
Aussi connu sous le nom d'exponentielle normalisée.
aij=exp(zij)∑kexp(zik)
Celui-ci est un peu étrange car la sortie d'un seul neurone dépend des autres neurones de cette couche. Cela devient également difficile à calculer, car peut être une valeur très élevée, auquel cas débordera probablement. De même, si est une valeur très basse, elle débordera et deviendra .zijexp(zij)zij0
Pour lutter contre cela, nous allons plutôt calculer . Cela nous donne:log(aij)
log(aij)=log⎛⎝⎜exp(zij)∑kexp(zik)⎞⎠⎟
log(aij)=zij−log(∑kexp(zik))
Ici, nous devons utiliser l' astuce log-sum-exp :
Disons que nous calculons:
log(e2+e9+e11+e−7+e−2+e5)
Nous allons d'abord trier nos exponentielles par magnitude pour des raisons de commodité:
log(e11+e9+e5+e2+e−2+e−7)
Ensuite, puisque est notre plus haut, nous multiplions par :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)
Nous pouvons ensuite calculer l'expression de droite et en prendre le journal. Vous pouvez le faire car cette somme est très petite en ce qui concerne . Par conséquent, un dépassement inférieur à 0 n'aurait pas été suffisamment important pour faire une différence de toute façon. Le débordement ne peut pas se produire dans l'expression de droite car nous avons la garantie qu'après la multiplication par , tous les pouvoirs seront .log(e11)e−11≤0
Formellement, nous appelons . Ensuite:m=max(zi1,zi2,zi3,...)
log(∑kexp(zik))=m+log(∑kexp(zik−m))
Notre fonction softmax devient alors:
aij=exp(log(aij))=exp(zij−m−log(∑kexp(zik−m)))
Également en tant que sidenote, le dérivé de la fonction softmax est:
dσ(zij)dzij=σ′(zij)=σ(zij)(1−σ(zij))
Maxout
Celui-ci est également un peu délicat. L'idée est essentiellement de diviser chaque neurone de notre couche maxout en un grand nombre de sous-neurones, chacun ayant ses propres poids et biais. Ensuite, l'entrée d'un neurone va à la place de chacun de ses sous-neurones, et chaque sous-neurone sort simplement leurs (sans appliquer de fonction d'activation). Le de ce neurone est alors le maximum de toutes les sorties de son sous-neurone.zaij
Formellement, dans un seul neurone, disons que nous avons sous-neurones. ensuiten
aij=maxk∈[1,n]sijk
où
sijk=ai−1∙wijk+bijk
( est le produit scalaire )∙
Pour nous aider à réfléchir à cela, considérons la matrice de poids pour la couche d'un réseau de neurones utilisant, par exemple, une fonction d'activation sigmoïde. est une matrice 2D, où chaque colonne est un vecteur pour le neurone contenant un poids pour chaque neurone de la couche précédente .WiithWiWijji−1
Si nous allons avoir des sous-neurones, nous aurons besoin d'une matrice de poids 2D pour chaque neurone, car chaque sous-neurone aura besoin d'un vecteur contenant un poids pour chaque neurone de la couche précédente. Cela signifie que est maintenant une matrice de poids 3D, où chaque est la matrice de poids 2D pour un seul neurone . Et alors est un vecteur du sous-neurone dans le neurone qui contient un poids pour chaque neurone de la couche précédente .WiWijjWijkkji−1
De même, dans un réseau neuronal qui utilise à nouveau, par exemple, une fonction d'activation sigmoïde, est un vecteur avec un biais pour chaque neurone de la couche .bibijji
Pour ce faire avec les sous-neurones, nous avons besoin d’une matrice de biais 2D pour chaque couche , où est le vecteur avec un biais pour chaque sous-neurone dans le neurone.biibijbijkkjth
Avoir une matrice de poids et un vecteur de biais pour chaque neurone rend les expressions ci-dessus très claires, il suffit d'appliquer les poids de chaque sous-neurone aux sorties de couche , puis appliquant leurs biais et en prenant le maximum.wijbijwijkai−1i−1bijk
Réseaux à fonction radiale
Les réseaux de fonctions à base radiale sont une modification des réseaux de neurones à action directe où, au lieu d’utiliser
aij=σ(∑k(wijk⋅ai−1k)+bij)
nous avons un poids par noeud dans la couche précédente (comme d'habitude), ainsi qu'un vecteur moyen et un vecteur de déviation standard pour chaque noeud de la couche précédente.wijkkμijkσijk
Ensuite, nous appelons notre fonction d'activation pour éviter de la confondre avec les vecteurs d'écart type . Maintenant, pour calculer nous devons d’abord calculer un pour chaque noeud de la couche précédente. Une option consiste à utiliser la distance euclidienne:ρσijkaijzijk
zijk=∥(ai−1−μijk∥−−−−−−−−−−−√=∑ℓ(ai−1ℓ−μijkℓ)2−−−−−−−−−−−−−√
Où est l' élément de . Celui-ci n'utilise pas le . Alternativement, il y a la distance de Mahalanobis, qui est supposée être plus performante:μijkℓℓthμijkσijk
zijk=(ai−1−μijk)TΣijk(ai−1−μijk)−−−−−−−−−−−−−−−−−−−−−−√
où est la matrice de covariance , définie comme suit:Σijk
Σijk=diag(σijk)
En d'autres termes, est la matrice diagonale avec tant qu'éléments diagonaux. Nous définissons et tant que vecteurs de colonne ici car il s'agit de la notation normalement utilisée.Σijkσijkai−1μijk
Ce sont vraiment juste dire que la distance de Mahalanobis est définie comme
zijk=∑ℓ(ai−1ℓ−μijkℓ)2σijkℓ−−−−−−−−−−−−−−⎷
Où est l' élément de . Notez que doit toujours être positif, mais il s’agit d’une exigence typique de l’écart type, ce qui n’est pas surprenant.σijkℓℓthσijkσijkℓ
Si vous le souhaitez, la distance de Mahalanobis est suffisamment générale pour que la matrice de covariance puisse être définie comme une autre matrice. Par exemple, si la matrice de covariance est la matrice d'identité, notre distance de Mahalanobis se réduit à la distance euclidienne. est assez commun cependant, et est connue sous le nom de distance euclidienne normalisée .ΣijkΣijk=diag(σijk)
De toute façon, une fois que notre fonction de distance a été choisie, nous pouvons calculer viaaij
aij=∑kwijkρ(zijk)
Dans ces réseaux, ils choisissent de multiplier par des poids après avoir appliqué la fonction d'activation pour des raisons.
Ceci décrit comment créer un réseau multi-couches à fonction de base radiale. Toutefois, il n’ya généralement qu’un de ces neurones et sa sortie est la sortie du réseau. Il est dessiné comme plusieurs neurones car chaque vecteur moyen et chaque vecteur d'écart type de ce neurone est considéré comme un "neurone" et, après toutes ces sorties, il y a une autre couche qui prend la somme de ces valeurs calculées multipliée par les poids, comme ci-dessus. Le diviser en deux couches avec un vecteur "sommateur" à la fin me semble étrange, mais c'est ce qu'elles font.μijkσijkaij
Voir aussi ici .
Fonction d'activation de réseau à fonction radiale
Gaussien
ρ(zijk)=exp(−12(zijk)2)
Multiquadratique
Choisissez un point . Ensuite, nous calculons la distance de à :(x,y)(zij,0)(x,y)
ρ(zijk)=(zijk−x)2+y2−−−−−−−−−−−−√
C'est de Wikipedia . Ce n'est pas borné et peut être une valeur positive, bien que je me demande s'il existe un moyen de la normaliser.
Lorsque , cela équivaut à absolu (avec un décalage horizontal ).y=0x
Multiquadratique inverse
Identique au quadratique, sauf retourné:
ρ(zijk)=1(zijk−x)2+y2−−−−−−−−−−−−√
* Graphiques d'Intmath's Graphs utilisant SVG .