6 votos

¿Es posible hacer Fizz Buzz en el aprendizaje profundo?

Después de leer un chiste de Fizz Buzz en Tensorflow , tengo curiosidad por saber si es posible hacer una tarea tan simple correctamente con el aprendizaje profundo. ¿Alguna explicación teórica de la razón por la que podemos o no podemos?

Es una operación de módulo, si podemos hacer Fizz Buzz, ¿quizás el aprendizaje profundo también se puede usar en teoría de números, como encontrar números primos?

9voto

Marcus M Puntos 3270

Como el autor de los post del blog, estoy feliz de decir que (con la elección correcta de hyperparameters y un poco de suerte) Fizz Buzz puede ser completamente aprendido por una red neuronal con una capa oculta.

Pasé algún tiempo en investigar por qué funciona, y la razón es algo interesante. Se basa en la representación binaria de la entrada y la siguiente observación:

  • si dos números difieren en un múltiplo de 15, a continuación, pertenecen a la misma fizzbuzz "clase" (como-es / fizz / buzz / fizzbuzz)

Resulta que hay un número de maneras en que usted puede invertir dos bits en un 10 dígitos del número binario y obtener un número que se diferencia por un múltiplo de 15. Por ejemplo, si usted comienza con un número x y activar la encriptación de 128 bits y apague el de 8 bits, se obtiene x + 120. Hay muchos otros ejemplos.

Y si usted tiene una función lineal de los bits que pone la idénticos pesos en los dos bits, se va a producir la misma salida para x y x + 128.

Como hay muchos de esos bits pares, resulta que la red neuronal básicamente

  • aprende un montón de clases de equivalencia (por ejemplo, uno podría contener x, x + 120, y un par de otros números), y
  • "memoriza" la respuesta correcta para cada clase de equivalencia

Y así resulta que cuando se entrena el modelo de los números 101 a 1023, tienes suficiente de clases de equivalencia para predecir correctamente en 1 a 100.

(Esto no es formal, por supuesto, esto es sólo un resumen de alto nivel de lo que yo aprendí cuando investigó la red).

--

En cuanto a su pregunta sobre la búsqueda de números primos, me sorprendería si un enfoque como este trabajado. Mi sensación es que el buen "mismo modulo 15" estructura de este problema es lo que hace que la red neuronal de trabajo, y es difícil pensar en algo análogo, por ejemplo, para encontrar los números primos.

0voto

Cheekysoft Puntos 239

Permítanme responder a la pregunta en un meme.

Por qué (siempre) aprendizaje profundo? Todas las redes neuronales qué es la regresión lineal (x*w+b) entre los no-linealidad en torno a la (intermedio) de la respuesta.

deep or derp

Vamos a hablar de la máquina de aprendizaje, mejor aún, de optimización. La obvia general de la clase de problemas te refieres es la función de la aproximación (no de regresión de por sí). Así que, ¿por qué no utilizar el método que fue desarrollado para hacer exactamente esto: que la escritura de programas. En teoría, sí, puede usar 'inteligencia artificial' métodos para crear programas y uno de ellos, teniendo en cuenta la cantidad suficiente de datos y el tiempo, teóricamente, puede ser FizzBuzz. O a un programa que calcula los números primos (y que programa podría ser teóricamente el mismo cuando está escrito por un ser humano). -- No hay aprendizaje profundo aquí -.

Aprendizaje a partir de los datos

Así, podemos aprender a partir de los datos? Sí, podemos. Pero primero debemos entender los datos y el ingeniero de algunas características. Porque sólo uno numérico no es una función expresiva suficiente... (por ahora).

Código entrante:

library(tidyverse)

theData <- data_frame(a = as.double(1:100),
                      a3 = as.double(a %% 3 == 0),
                      a5 = as.double(a %% 5 == 0),
                      cl = case_when((a3 > 0) & (a5 > 0) ~ 'FizzBuzz',
                                     a3 > 0 ~ 'Fizz',
                                     a5 > 0 ~ 'Buzz',   
                                     TRUE ~ 'Number')) %>%
  mutate(cl = factor(cl))

Ahora tenemos una característica numérica de una (números) y a3 y a5 te ayuda con la decisión ...

enter image description here

... árbol. (╯°□°)╯︵ ┻━┻ de nuevo, no aprendizaje profundo aquí. Pero una apilada modelo: el primer nivel es el DT y scond nivel (uso de Viola-Jones-Cascadas o simple filtro en la Number de respuestas), un viejo y simple de regresión lineal con la solución de $y=a$.

El DT de primera:

treeModel <- rpart::rpart(cl ~ ., theData, 
                          control = rpart::rpart.control(minsplit = 5))
rattle::fancyRpartPlot(treeModel, caption = '')

enter image description here

ESO ES DE LOCOS! Un simple árbol de decisión aprendido FizzBuzz! Pero lo hizo? Aplicar algunos de los datos de prueba:

testData <- data_frame(a = as.double(200:300),
                      a3 = as.double(a %% 3 == 0),
                      a5 = as.double(a %% 5 == 0),
                      cl = case_when((a3 > 0) & (a5 > 0) ~ 'FizzBuzz',
                                     a3 > 0 ~ 'Fizz',
                                     a5 > 0 ~ 'Buzz',   
                                     TRUE ~ 'Number'))

predictions <- predict(treeModel, testData, type = 'class')
table(testData$cl, predictions) 


        predictions
         Buzz Fizz FizzBuzz Number
Buzz       14    0        0      0
Fizz        0   27        0      0
FizzBuzz    0    0        7      0
Number      0    0        0     53

Perfecto en el examen del conjunto de los números 200 a 300!

Bien, la segunda capa es fácil:

lmModel <- lm(arep ~ a - 1, mutate(theData, arep = a))

El error de la estimación del número de

testData %>%
  mutate(pred = predict(treeModel, ., type = 'class')) %>%
  filter(pred == 'Number') %>%
  mutate(apred = predict(lmModel, .),
         error = a - apred) %>%
  pull(error) %>%
  summary()

     Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
5.684e-14 5.684e-14 5.684e-14 5.684e-14 5.684e-14 5.684e-1

... bueno, muy cercano a 0. Tada!

Hemos aprendido FizzBuzz a partir de los datos!

Derp de aprendizaje

Probablemente usted puede hacer lo mismo con el aprendizaje profundo. Usted también puede hacer apilados modelos con LSTM capas y de convolución (ya saben, porque de módulo 3 y 5), y con una enorme cantidad de datos que usted puede tener una oportunidad para generalizar algunos patrones... sí... no.

Así que espero que esta respuesta ayuda a aclarar que sí es posible. Y no, usted no necesita aprendizaje profundo para hacer el trabajo. Y ahora, a partir de una sola característica a incluso lo profundo de aprendizaje no ser capaz de aprender FizzBuzz.

Como para los números primos... si calcular/ingeniero tantas características como hay números primos, usted puede aprender a partir de los datos, también. _(ツ)_/

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X