Documentos de Académico
Documentos de Profesional
Documentos de Cultura
La Regla de La Cadena
La Regla de La Cadena
The Chain Rule En el Capítulo 7, cuando construyamos una red neuronal, vamos a
necesitar un truco matemático especial llamado regla de la cadena. Cuando
compongamos las capas de la red neuronal, tendremos que desenredar las derivadas de
cada capa. Pero por ahora aprendamos la regla de la cadena con un ejemplo algebraico
simple. Digamos que te dan dos funciones:
y = x2 + 1
z = y3 - 2
Observe que estas dos funciones están vinculadas, porque y es la variable de salida en la
primera función pero es la variable de entrada en la segunda. Esto significa que podemos
sustituir la primera función y en la segunda función z así:
Pero mira esto. Comencemos de nuevo y tomemos un enfoque diferente. Si tomamos las
derivadas de las funciones y y z por separado, y luego las multiplicamos juntas, ¡esto
también produce la derivada de z con respecto a x ! Vamos a intentarlo:
Muy bien, 6 xy2 puede no parecerse a 6 x (x2 +1) 2, pero eso es solo porque aún no
hemos sustituido la función y. Haga eso para que toda la derivada se exprese en
términos de x sin y.
Ahora vemos que tenemos la misma función derivada 6x (x2 +1)2 !
Esta es la regla de la cadena, que dice que para una función dada y (con variable de
entrada x ) compuesta en otra función z (con variable de entrada y ), podemos encontrar
la derivada de z con respecto a x multiplicando las dos derivadas respectivas :
El ejemplo 1-25 muestra el código SymPy que hace esta comparación, mostrando que la
derivada de la regla de la cadena es igual a la derivada de la función sustituida.
Ejemplo 1-25. Calcular la derivada dz/dx con y sin la regla de la cadena, pero aún
obteniendo la misma respuesta
from sympy import *
x, y = symbols('x y')
# derivative for first function
# need to underscore y to prevent variable clash
_y = x**2 + 1
dy_dx = diff(_y)
# derivative for second function
z = y**3 - 2
dz_dy = diff(z)
# Calculate derivative with and without
# chain rule, substitute y function
dz_dx_chain = (dy_dx * dz_dy).subs(y, _y)
dz_dx_no_chain = diff(z.subs(y, _y))
# Prove chain rule by showing both are equal
print(dz_dx_chain) # 6*x*(x**2 + 1)**2
print(dz_dx_no_chain) # 6*x*(x**2 + 1)**2
La regla de la cadena es una parte clave del entrenamiento de una red neuronal con los
pesos y sesgos adecuados. En lugar de desenredar la derivada de cada nodo en forma
de cebolla anidada, podemos multiplicar las derivadas en cada nodo, lo cual es
matemáticamente mucho más fácil.
Integrales
Lo contrario de una derivada es una integral, que encuentra el área bajo la curva para un
rango dado. En los Capítulos 2 y 3, encontraremos las áreas bajo distribuciones de
probabilidad. Aunque no usaremos integrales directamente, y en su lugar usaremos
funciones de densidad acumulativa que ya están integradas, es bueno saber cómo las
integrales encuentran áreas bajo curvas. El Apéndice A contiene ejemplos del uso de este
enfoque en distribuciones de probabilidad.
Quiero adoptar un enfoque intuitivo para aprender integrales llamado Reimann Sums, uno
que se adapte de manera flexible a cualquier función continua. Primero, señalemos que
encontrar el área de un rango debajo de una línea recta es fácil. Digamos que tengo una
función f( x ) = 2x y quiero encontrar el área debajo de la línea entre 0 y 1, como se
muestra en la figura 1-9.
Figura 1-9. Cálculo de un área bajo una función lineal
Observe que estoy encontrando el área delimitada entre la línea y el eje x, y en el rango x
de 0,0 a 1,0. Si recuerdas las fórmulas básicas de geometría, el área A de un triángulo es
donde b es la longitud de la base y h es la altura. Podemos detectar visualmente
que b = 1 y h = 2. Entonces, al conectarnos a la fórmula, obtenemos para nuestra área
1.0 como se calcula aquí:
A=1
Eso no estuvo mal, ¿verdad? Pero veamos una función en la que es difícil encontrar el
área debajo: f ( x ) = x 2+ 1. ¿Cuál es el área entre 0 y 1 sombreada en la figura 1-10 ?
Figura 1-10. Calcular el área bajo funciones no lineales es menos sencillo
Nuevamente, estamos interesados en el área debajo de la curva y sobre el eje x, solo
dentro del rango x entre 0 y 1. La curvatura aquí no nos brinda una fórmula geométrica
clara para encontrar el área, pero aquí hay un pequeño truco inteligente. tu puedes hacer.
¿Qué pasa si empaquetamos cinco rectángulos de igual longitud debajo de la curva como
se muestra en la Figura 1-11, donde la altura de cada uno se extiende desde el eje x
hasta donde el punto medio toca la curva?
El área de un rectángulo es A = length × width A = largo × ancho , por lo que podríamos
sumar fácilmente las áreas de los rectángulos. ¿Nos daría eso una buena aproximación
del área bajo la curva? ¿Qué pasa si empacamos 100 rectángulos? 1,000? 100,000? A
medida que aumentamos el número de rectángulos mientras disminuimos su ancho, ¿no
nos acercaríamos al área bajo la curva? Sí, lo haríamos, y es otro caso más en el que
aumentamos/disminuimos algo hacia el infinito para acercarnos a un valor real.
Figura 1-11. Rectángulos de embalaje debajo de una curva para aproximar el área
Probémoslo en Python. Primero necesitamos una función que aproxime una integral que
llamaremos approximate_integral(). Los argumentos a y b especificarán el mínimo y el
máximo del rango x, respectivamente. n será el número de rectángulos a empaquetar y f
será la función que estamos integrando. Implementamos la función en el Ejemplo 1-26 y
luego la usamos para integrar nuestra función f ( x ) = x 2+ 1 con cinco rectángulos, entre
0.0 y 1.0.
Ejemplo 1-26. Una aproximación integral en Python
def approximate_integral(a, b, n, f):
delta_x = (b - a) / n
total_sum = 0
for i in range(1, n + 1):
midpoint = 0.5 * (2 * a + delta_x * (2 * i - 1))
total_sum += f(midpoint)
return total_sum * delta_x
def my_function(x):
return x**2 + 1
area = approximate_integral(a=0, b=1, n=5, f=my_function)
print(area) # prints 1.33
Entonces obtenemos un área de 1.33. ¿Qué pasa si usamos 1,000 rectángulos?
Probémoslo en el ejemplo 1-27.
Ejemplo 1-27. Otra aproximación integral en Python
area = approximate_integral(a=0, b=1, n=1000, f=my_function)
print(area) # prints 1.333333250000001
Bien, estamos obteniendo algo más de precisión aquí y obteniendo algunos
lugares decimales más. ¿Qué pasa con un millón de rectángulos como se muestra
en el Ejemplo 1-28 ?
Ejemplo 1-28. Otra aproximación integral en Python
area = approximate_integral(a=0, b=1, n=1_000_000, f=my_function)
print(area) # prints 1.3333333333332733
Bien, creo que estamos obteniendo un rendimiento decreciente aquí y
convergiendo en el valor 1. 333 ¯ donde la parte ".333" se repite para siempre. Si
fuera un número racional, probablemente 4/3 = 1. 333. A medida que aumentamos
el número de rectángulos, la aproximación comienza a alcanzar su límite con
decimales cada vez más pequeños.
Ahora que tenemos cierta intuición sobre lo que estamos tratando de lograr y por
qué, hagamos un enfoque más exacto con SymPy, que es compatible con los
números racionales, en el Ejemplo 1-29.
Ejemplo 1-29. Uso de SymPy para realizar la integración
from sympy import *
# Declare 'x' to SymPy
x = symbols('x')
# Now just use Python syntax to declare function
f = x**2 + 1
# Calculate the integral of the function with respect to x
# for the area between x = 0 and 1
area = integrate(f, (x, 0, 1))
print(area) # prints 4/3¡
Conclusión
En este capítulo cubrimos algunos fundamentos que usaremos para el resto de
este libro. Desde la teoría de números hasta los logaritmos y las integrales de
cálculo, destacamos algunos conceptos matemáticos importantes relevantes para
la ciencia de datos, el aprendizaje automático y el análisis. Es posible que tenga
preguntas acerca de por qué estos conceptos son útiles. ¡Eso vendrá después!
Antes de pasar a discutir la probabilidad, tómate un poco de tiempo para repasar
estos conceptos una vez más y luego haz los siguientes ejercicios. Siempre puede
volver a visitar este capítulo a medida que avanza en este libro y actualizar según
sea necesario cuando comience a aplicar estas ideas matemáticas.