Semana 5 | Stanford CS229 Aprendizaje automático

prefacio

Este artículo son las notas de estudio del curso de aprendizaje automático CS229 de la Universidad de Stanford

La parte principal de este artículo es una reimpresión del Dr. Huang Haiguang. El enlace se proporciona al final del artículo . Si está interesado, puede visitar directamente la página de inicio de las notas para descargar los materiales del curso y los códigos de tarea correspondientes.

Sitio web oficial del curso: CS229: Machine Learning (stanford.edu)

Video del curso: Stanford CS229: Curso de aprendizaje automático, Clase 1 - Andrew Ng (otoño de 2018) - YouTube

Resumen de notas: Resumen de notas | Stanford CS229 Machine Learning_ReturnTmp's Blog-CSDN Blog

semana 5

9. Redes neuronales: aprendizaje

9.1 Función de costo

Video de referencia: 9 - 1 - Función de costo (7 min).mkv

Primero presente algunos nuevos métodos de marcador que son convenientes para la discusión posterior:

Suponga que las muestras de entrenamiento de la red neuronal tienen mmm , cada uno de los cuales contiene un conjunto de entradasxxx y un conjunto de señales de salidayyy ,LLL representa el número de capas de la red neuronal,SI S_ISyoIndica el número de neuronas en cada capa ( S l S_lSyoIndica el número de neuronas en la capa de salida), SL S_LSLRepresenta el número de unidades de procesamiento en la última capa.

La clasificación de las redes neuronales se define en dos casos: clasificación de dos clases y clasificación de clases múltiples,

Clasificación binaria: SL = 0 , y = 0 o 1 S_L=0, y=0\, o\, 1SL=0 ,y=0o1 indica qué categoría;

KKK类分类:SL = k , yi = 1 S_L=k, y_i = 1SL=k ,yyo=1 significa asignado a laiiClase i ,(k > 2) (k>2)( k>2 )

Recordamos que nuestra función de costo en el problema de regresión logística es:

$ J\left(\theta \right)=-\frac{1}{m}\left[\sum_\limits{i=1} { m}{y} {(i)}\log{h_\theta( {x} {(i)})}+\left(1-{y} {(i)}\right)log\left(1-h_\theta\left({x} {(i)}\right) \right)\right]+\frac{\lambda}{2m}\sum_\limits{j=1} { n}{\theta_j}^{2} $

En la regresión logística, solo tenemos una variable de salida, también conocida como escalar , y solo una variable dependiente yyy , pero en una red neuronal podemos tener muchas variables de salida, nuestrah θ ( x ) h_\theta(x)hi( x ) es una dimensiónKKEl vector de K y la variable dependiente en nuestro conjunto de entrenamiento también es un vector de la misma dimensión, por lo que nuestra función de costo será más complicada que la regresión logística, como: \newcommand{\subk}[1]{ #1_k}
h θ ( x ) ∈ RK h_\theta\left(x\right)\in \mathbb{R}^{K}hi( X )RK ( h θ ( x ) ) i = i-ésima salida {\left({h_\theta}\left(x\right)\right)}_{i}={i}^{th} \text{output}( hi( X ) )yo=isalida _ _

Error de análisis de KaTeX: secuencia de control no definida: \subk en la posición 94: …_k}^{(i)} \log \̲s̲u̲b̲k̲{(h_\Theta(x^{(…

La idea detrás de esta función de costo aparentemente compleja sigue siendo la misma. Esperamos usar la función de costo para observar el error entre el resultado predicho del algoritmo y la situación real. La única diferencia es que para cada fila de características, daremos KKPredicciones K , básicamente podemos usar bucles para predecirKKK resultados diferentes, y luego en el ciclo de utilización enKKElija la que tenga la probabilidad más alta entre las predicciones K y compárela con yyy para comparar.

El término de regularización solo excluye cada capa θ 0 \theta_0i0Después de eso, el θ \theta de cada capaLa suma de matrices theta . El bucle más internojjj recorre todas las filas (porsl + 1 s_{l+1}sl + 1Se determina el número de unidades de activación en la capa), ciclo iirecorro todas las columnas, por capa (sl s_lsyocapa) está determinada por el número de unidades de activación. Es decir: h θ ( x ) h_\theta(x)hiLa distancia entre ( x ) y el valor verdadero es la suma de cada salida de muestra-cada clase, y el término de sesgola regularizacióndeprocesa la suma de los cuadrados de todos los parámetros.

9.2 Algoritmo de retropropagación

Video de referencia: 9 - 2 - Algoritmo de retropropagación (12 min).mkv

Usamos un método de propagación directa cuando calculamos los resultados de predicción de la red neuronal antes. Comenzamos desde la primera capa y la calculamos capa por capa hasta el h θ ( x ) h_{\theta} de la última capa \left(x ) \bien)hi( x )

Ahora, para calcular la derivada parcial de la función de costo ∂ ∂ Θ ij ( l ) J ( Θ ) \frac{\partial}{\partial\Theta^{(l)}_{ij}}J\left(\Theta \derecho)Θyo( l )j( Θ ) , necesitamos usar un algoritmo de retropropagación, es decir, primero calcular el error de la última capa y luego calcular inversamente el error de cada capa capa por capa hasta la penúltima capa.
Ilustremos el algoritmo de retropropagación con un ejemplo.

Supongamos que nuestro conjunto de entrenamiento tiene solo una muestra ( x ( 1 ) , y ( 1 ) ) \left({x}^{(1)},{y}^{(1)}\right)( X( 1 ) ,y( 1 ) ), nuestra red neuronal es una red neuronal de cuatro capas, dondeK = 4, SL = 4, L = 4 K=4, S_{L}=4, L=4k=4 , SL=4 , L=4 :

Algoritmo de propagación directa:

Consulte el siguiente proceso de derivación de fórmulas: https://blog.csdn.net/qq_29762941/article/details/80343185

Empezamos con el error de la última capa, que es la predicción de la unidad de activación ( a ( 4 ) {a^{(4)}}a( 4 ) ) y el valor real (yky^kyk ), (k = 1 : kk=1:kk=1:k ).
Usamosδ\deltaδ para representar el error, entonces:δ ( 4 ) = a ( 4 ) − y \delta^{(4)}=a^{(4)}-yd( 4 )=a( 4 )yUtilizamos
este valor de error para calcular el error de la capa anterior:δ ( 3 ) = ( Θ ( 3 ) ) T δ ( 4 ) ∗ g ′ ( z ( 3 ) ) \delta^{(3)}=\left ({\Theta^{(3)}}\right)^{T}\delta^{(4)}\ast g'\left(z^{(3)}\right)d( 3 )=( jue( 3 ) )Td( 4 )gramo( z( 3 ) )
dondeg ′ ( z ( 3 ) ) g'(z^{(3)})gramo (z( 3 ) )esSSLa derivada de la función sigmoidea, g ′ ( z ( 3 ) ) = a ( 3 ) ∗ ( 1 − a ( 3 ) ) g'(z^{(3)})=a^{(3)}\ast ( 1-a^{(3)})gramo (z( 3 ) )=a( 3 )( 1a( 3 ) )。而( θ ( 3 ) ) T δ ( 4 ) (θ^{(3)})^{T}\delta^{(4)}( yo( 3 ) )T δ( 4 ) es la suma de los errores causados ​​por los pesos. El siguiente paso es seguir calculando el error de la segunda capa:
$ \delta{(2)}=(\Theta{(2)}){T}\delta{(3)}\ast g'(z^ {(2) })$
Debido a que la primera capa es una variable de entrada, no hay error. Después de tener todas las expresiones del error, podemos calcular la derivada parcial de la función de costo, asumiendoλ = 0 λ=0yo=0 , es decir, cuando no hacemos ninguna regularización:
∂ ∂ Θ ij ( l ) J ( Θ ) = aj ( l ) δ il + 1 \frac{\partial}{\partial\Theta_{ij}^{( l)}}J(\Theta)=a_{j}^{(l)} \delta_{i}^{l+1}Θyo( l )J ( Θ )=aj( l )dil + 1

Es importante entender claramente el significado de los subíndices en la fórmula anterior:

éll representa la capa calculada actual.

ni una palabraj representa el subíndice de la unidad de activación en la capa de cálculo actual, y también será el jj de la siguientecapaSubíndices de las j variables de entrada.

yoi representa el subíndice de la unidad de error en la siguiente capa, que está sujeta a la segundaiiÍndice de la celda de error en la siguiente capa afectada por la fila i .

Si consideramos la regularización, y nuestro conjunto de entrenamiento es una matriz de características en lugar de un vector. En el caso especial anterior, necesitamos calcular las unidades de error en cada capa para calcular las derivadas parciales de la función de costo. En un caso más general, también necesitamos calcular la unidad de error de cada capa, pero necesitamos calcular la unidad de error para todo el conjunto de entrenamiento. En este momento, la unidad de error también es una matriz. Usamos Δ ij ( l ) \Delta^ { (l)}_{ij}Dyo( l )para representar la matriz de error. No. lliide la capa lLa unidad de activación i se ve afectada por eljjthEl error causado por la influencia de j parámetros.

Nuestro algoritmo se expresa como:

Es decir, primero use el método de propagación directa para calcular la unidad de activación de cada capa, use los resultados del conjunto de entrenamiento y los resultados predichos por la red neuronal para encontrar el error de la última capa y luego use el error para calcular el unidad de activación hasta la segunda capa usando el método de propagación hacia atrás.todos los errores.

Después de encontrar Δ ij ( l ) \Delta_{ij}^{(l)}Dyo( l )Después de eso, podemos calcular la derivada parcial de la función de costo, el método de cálculo es el siguiente:
$ D_{ij}^{(l)} :=\frac{1}{m}\Delta_{ij} { (l )}+\ lambda\Theta_{ij} {(l)}$ si j ≠ 0 {si}\;j \neq 0yo fj=0

$ D_{ij}^{(l)} :=\frac{1}{m}\Delta_{ij}^{(l)}$ si j = 0 {si}\; j = 0yo fj=0

En Octave , si queremos usar fminucun algoritmo de optimización de este tipo para resolver la matriz de peso, primero debemos expandir la matriz en un vector y luego volver a convertirla en la matriz después de usar el algoritmo para encontrar la solución óptima.

Supongamos que tenemos tres matrices de peso, Theta1, Theta2 y Theta3, con dimensiones de 10*11, 10*11 y 1*11 respectivamente, el siguiente
código puede lograr dicha conversión:

thetaVec = [Theta1(:) ; Theta2(:) ; Theta3(:)]

...optimization using functions like fminuc...

Theta1 = reshape(thetaVec(1:110, 10, 11);

Theta2 = reshape(thetaVec(111:220, 10, 11);

Theta1 = reshape(thetaVec(221:231, 1, 11);

9.3 Comprensión intuitiva del algoritmo de retropropagación

Video de referencia: 9 - 3 - Intuición de retropropagación (13 min).mkv

En el video anterior, presentamos el algoritmo de propagación hacia atrás. Para muchas personas, cuando ven este algoritmo por primera vez, la primera impresión suele ser que este algoritmo requiere muchos pasos complicados. Es simplemente demasiado complicado. Realmente no lo sé. saber cómo se deben usar estos pasos juntos. Es como una caja negra llena de pasos complicados. Si también se siente así con respecto al algoritmo de retropropagación, esto es realmente normal. Comparado con el algoritmo de regresión lineal y el algoritmo de regresión logística, desde un punto de vista matemático, el algoritmo de retropropagación no parece ser conciso. De hecho, tengo Usé este algoritmo durante muchos años, pero aún así, incluso ahora, a menudo siento que mi comprensión del algoritmo de propagación hacia atrás no es muy profunda, y cómo se ejecuta el algoritmo de propagación hacia atrás, y no hay una comprensión muy intuitiva. Los estudiantes que hayan realizado ejercicios de programación deberían poder sentir que estos ejercicios pueden ayudarlo más o menos, resolver estos pasos complicados y consolidar cómo se implementa el algoritmo de retropropagación, para que pueda dominar este algoritmo por sí mismo.

En este video, quiero discutir estos pasos complejos del algoritmo de propagación hacia atrás con más profundidad, y espero brindarle una sensación más completa e intuitiva, comprender lo que hacen estos pasos y espero que a través de este video, pueda comprender que es al menos un algoritmo razonable. Pero tal vez incluso después de ver este video, todavía sientas que la retropropagación sigue siendo muy complicada, sigue siendo como una caja negra, con demasiados pasos complicados, y todavía te sientes un poco mágico, lo cual está bien. Aunque he estado en contacto con la retropropagación durante tantos años, a veces todavía siento que este es un algoritmo incomprensible, pero espero que este video pueda ayudar un poco. Para comprender mejor el algoritmo de retropropagación, echemos un vistazo más de cerca. en el anterior El principio de propagación de la dirección:

Algoritmo de propagación directa:

Lo que hace el algoritmo de retropropagación es:

感悟:上图中的δ j ( l ) = " error " ofcost for aj ( l ) ( unidad j en la capa l ) \delta^{(l)}_{j}="error" \ of cost \ for \ a^{(l)}_{j} \ (unidad \ j \ en \ capa \ l)dj( l )=" error " de costo de un _ _ _   j( l ) ( u ni t j in l a yer l )     se entiende de la siguiente manera:

δ j ( l ) \delta^{(l)}_{j}dj( l )Equivalente a la llEl jjcapa lEl "error" del elemento de activación obtenido en la unidad j , es decir, el "correcto"aj ( l ) a^{(l)}_{j}aj( l )y el aj calculado ( l ) a^{(l)}_{j}aj( l )pobre.

aj ( l ) = g ( z ( l ) ) a^{(l)}_{j}=g(z^{(l)})aj( l )=gramo ( z( l ) ), (g es la función sigmoidea). Podemos imaginarδ j ( l ) \delta^{(l)}_{j}dj( l )La pequeña diferenciación que se toma al derivar funciones, por lo que es más exacto decir δ j ( l ) = ∂ ∂ zj ( l ) cost ( i ) \delta^{(l)}_{j}=\frac { \parcial}{\parcial z^{(l)}_{j}}costo(i)dj( l )=∂z _j( l )costo t ( yo )

9.4 Nota de implementación: Expandir parámetros

Video de referencia: 9 - 4 - Nota de implementación_ Parámetros de desenrollado (8 min).mkv

En el video anterior, hablamos sobre cómo calcular la derivada de la función de costo usando el algoritmo de retropropagación. En este video, quiero guiarlo rápidamente a través de una implementación detallada de cómo expandir sus parámetros de matrices a vectores para nuestro uso en pasos de optimización avanzados.

9.5 Prueba de gradiente

Vídeo de referencia: 9 - 5 - Comprobación de degradado (12 min).mkv

Cuando usamos el algoritmo de descenso de gradiente para un modelo más complejo (como una red neuronal), puede haber algunos errores no detectables, lo que significa que, aunque el costo parece estar disminuyendo, el resultado final puede no ser óptimo.

Para evitar tales problemas, adoptamos un método llamado verificación de gradiente numérico ( Numerical Gradient Checking ). La idea de este método es verificar si el valor de la derivada que calculamos es realmente el que queremos al estimar el valor del gradiente.

El método utilizado para estimar el gradiente es seleccionar dos puntos muy cercanos a lo largo de la dirección de la tangente en la función de costo y luego calcular el promedio de los dos puntos para estimar el gradiente. Es decir, para un θ \theta específicoθ , calculamos que enθ \thetaθ -$\varepsilon $ yθ \thetaEl valor de costo de θ + $\varepsilon $ ($\varepsilon $ es un valor muy pequeño, generalmente 0.001), y luego calcule el promedio de los dos costos para estimar el valor enθ \thetaEl valor de costo en θ .

El código en Octave es el siguiente:

gradApprox = (J(theta + eps) – J(theta - eps)) / (2*eps)

θ \ thetaCuando θ es un vector, necesitamos probar las derivadas parciales. Debido a que la prueba de la derivada parcial de la función de costo solo se prueba para un cambio de parámetro, la siguiente es una prueba solo paraθ 1 \theta_1i1Defina la ecuación:
∂ ∂ θ 1 = J ( θ 1 + ε 1 , θ 2 , θ 3 . . . θ n ) − J ( θ 1 − ε 1 , θ 2 , θ 3 . . . θ n ) ε \ frac{\parcial}{\parcial\theta_1}=\frac{J\left(\theta_1+\varepsilon_1,\theta_2,\theta_3...\theta_n \right)-J \left( \theta_1-\varepsilon_1, \theta_2 ,\theta_3...\theta_n\right)}{2\varepsilon}θ1=2 mij( yo1+mi1,i2,i3... yon)j( yo1mi1,i2,i3... yon)

Finalmente, necesitamos verificar las derivadas parciales calculadas por el método de retropropagación.

De acuerdo con el algoritmo anterior, las derivadas parciales calculadas se almacenan en la matriz D ij ( l ) D_{ij}^{(l)}Dyo( l )medio. Al probar, necesitamos expandir la matriz en un vector, y también usamos θ \thetaLa matriz θ se expande en un vector, y para cadaθ \thetaθ calcula un valor de gradiente aproximado, almacena estos valores en una matriz de gradiente aproximada, y finalmente la matriz resultante es la misma queD ij ( l ) D_{ij}^{(l)}Dyo( l )Comparar.

9.6 Inicialización aleatoria

Video de referencia: 9 - 6 - Inicialización aleatoria (7 min).mkv

Cualquier algoritmo de optimización necesita algunos parámetros iniciales. Hasta ahora hemos inicializado todos los parámetros a 0. Dicho método inicial es factible para la regresión logística, pero no para las redes neuronales. Si hacemos todos los parámetros iniciales 0, esto significará que todas las unidades de activación en nuestra segunda capa tendrán el mismo valor. De manera similar, si todos nuestros parámetros iniciales son un número distinto de cero, el resultado es el mismo.

Por lo general, inicializamos el parámetro como un valor aleatorio entre ε positivo y negativo. Supongamos que queremos inicializar aleatoriamente una matriz de parámetros con un tamaño de 10 × 11. El código es el siguiente:

Theta1 = rand(10, 11) * (2*eps) – eps

9.7 Poniendo todo junto

Video de referencia: 9 - 7 - Ensamblado (14 min).mkv

Resuma los pasos al usar una red neuronal:

Estructura de la red: Lo primero que hay que hacer es elegir la estructura de la red, es decir, decidir cuántas capas elegir y cuántas unidades tiene cada capa.

El número de unidades en la primera capa es el número de características en nuestro conjunto de entrenamiento.

El número de unidades en la última capa es el número de clases resultantes para nuestro conjunto de entrenamiento.

Si el número de capas ocultas es mayor que 1, asegúrese de que cada capa oculta tenga el mismo número de unidades, por lo general, cuantas más unidades de capa oculta, mejor.

Todo lo que realmente tenemos que decidir es el número de capas ocultas y el número de unidades en cada capa intermedia.

Entrenar la red neuronal:

  1. Inicialización aleatoria de parámetros

  2. Use el método de propagación directa para calcular todo h θ ( x ) h_{\theta}(x)hi( X )

  3. Escriba la función de costo de cálculo JJcódigo de J

  4. Calcule todas las derivadas parciales usando el método de retropropagación

  5. Pruebe estas derivadas parciales usando pruebas numéricas

  6. Usar un algoritmo de optimización para minimizar la función de costo

9.8 Conducción Autónoma

Vídeo de referencia: 9 - 8 - Conducción Autónoma (7 min).mkv

En este video, quiero presentarles un ejemplo importante de aprendizaje histórico de redes neuronales. Es decir, usar redes neuronales para lograr la conducción autónoma, lo que significa hacer que el automóvil aprenda a conducirse solo. El video que voy a mostrar a continuación es un video que obtuve de Dean Pomerleau, un colega mío en la Universidad Carnegie Mellon en la costa este de los EE. UU. En esta parte del video, comprenderá qué es exactamente la tecnología de visualización. Antes de ver este video, te diré qué es la tecnología de visualización.

En la parte inferior, que es la parte inferior izquierda, está la imagen de la carretera que tiene delante, tal como la ve el coche.

En la imagen, puede ver vagamente una carretera que se extiende un poco hacia la izquierda y luego un poco hacia la derecha, y luego, en la imagen de arriba, puede ver una barra de menú horizontal que muestra la dirección seleccionada por el operador de conducción. Es esta sección blanca brillante aquí la que muestra la dirección elegida por el conductor humano. Por ejemplo: la sección más a la izquierda corresponde a la operación de girar bruscamente a la izquierda, mientras que la sección más a la derecha corresponde a la operación de girar bruscamente a la derecha. Por tanto, el segmento ligeramente a la izquierda, es decir, la posición ligeramente a la izquierda del centro, indica que la operación del conductor humano en este punto es girar lentamente hacia la izquierda.

La segunda parte de la imagen corresponde a la dirección de conducción seleccionada por el algoritmo de aprendizaje. Y, de manera similar, esta línea blanca que muestra la dirección que eligió conducir la red neuronal aquí es un ligero giro a la izquierda, y en realidad verá la salida de la red como una línea gris antes de que la red neuronal comience a aprender segmentos, como este gris segmento que cubre toda el área, estas áreas grises simétricas muestran que la red neuronal se ha inicializado aleatoriamente y, en el momento de la inicialización, no sabemos cómo va el automóvil o no sabemos qué Elija la dirección de viaje. Solo después de que el algoritmo de aprendizaje se haya ejecutado durante un tiempo suficiente, aparecerá este segmento blanco en toda el área gris. Se muestra una dirección de conducción específica, lo que significa que el algoritmo de la red neuronal ha seleccionado una dirección de conducción clara en este momento, a diferencia del principio, que muestra un área gris claro borrosa, pero muestra una sección blanca brillante, lo que indica que se ha definido una dirección de conducción clara. sido seleccionado

ALVINN ( Vehículo Terrestre Autónomo en una Red Neural ) es un sistema inteligente basado en redes neuronales que aprende a conducir observando la conducción humana.ALVINN es capaz de controlar NavLab , instalado en una versión modificada del Hummer militar, que está cargado con sensores, ordenadores y drivers para pruebas de navegación de conducción autónoma. El primer paso para realizar la función de ALVINN es entrenarlo, es decir, entrenar a una persona para que conduzca un automóvil.

Luego deje que ALVINN mire, ALVINN genera una imagen digitalizada de la condición de la carretera adelante cada dos segundos y registra la dirección de conducción del conductor, la imagen del conjunto de entrenamiento obtenido se comprime a 30x32 píxeles y se proporciona como entrada a la red neuronal de tres capas de ALVINN , por Usando el algoritmo de aprendizaje de retropropagación, ALVINN será entrenado para obtener un resultado que sea básicamente similar a la dirección de dirección de un conductor humano. Al principio, la dirección elegida por nuestra red era aleatoria. Después de aproximadamente dos minutos de entrenamiento, nuestra red neuronal pudo simular con precisión la dirección de conducción de un conductor humano. Este proceso de entrenamiento se repitió para otros tipos de carreteras. Cuando la red está capacitado, el operador puede presionar el botón de ejecución y el vehículo comenzará a conducir.

ALVINN genera 12 imágenes digitalizadas por segundo y envía las imágenes a la red neuronal para el entrenamiento. Múltiples redes neuronales funcionan al mismo tiempo, y cada red genera una dirección de conducción y un parámetro de confianza de predicción, el que tiene la confianza Por ejemplo, aquí, la red entrenada en esta calle de sentido único se usará finalmente para controlar la dirección del vehículo. Aparece repentinamente un cruce frente al vehículo. Cuando el vehículo llega a esta intersección, la confianza correspondiente de nuestro La red de calles de camino cae bruscamente. Cuando cruce esta intersección, el carril doble adelante aparecerá a su vista, y la confianza de la red de carril doble comenzará a aumentar. Cuando su confianza aumente, se seleccionará la red de carril doble. para controlar la dirección de viaje, el vehículo se dirigirá de manera segura a una carretera de dos carriles.

Esta es la tecnología de conducción autónoma basada en redes neuronales. Por supuesto, todavía tenemos muchos experimentos más avanzados para realizar la tecnología de conducción autónoma. En algunos países y regiones, como Estados Unidos y Europa, ofrecen algunas tecnologías de control de conducción que son más estables que este método. Pero creo que es una hazaña increíble entrenar un automóvil autónomo tan poderoso utilizando una red neuronal basada en la propagación hacia atrás tan simple.

Supongo que te gusta

Origin blog.csdn.net/m0_63748493/article/details/132088916
Recomendado
Clasificación