Академический Документы
Профессиональный Документы
Культура Документы
Redes
Neuronales
Usted no me puede procesar con un cerebro normal.-
Charlie Sheen
Figura 10.1
La buena noticia es que el desarrollo de los sistemas de acoplamiento
animados con cdigo no requiere rigor cientfico o exactitud, como
hemos aprendido a lo largo de este libro. Simplemente puede ser
inspirado por la idea de la funcin cerebral.
Es probable que sea bastante obvio para usted que hay problemas que son
increblemente sencilla para un equipo para resolver, pero es difcil par a
usted. Tomar la raz cuadrada de 964 324, por ejemplo. Una lnea rpida
de cdigo produce el valor 982, un procesamiento de nmero computado
en menos de un milisegundo. Hay, por otro lado, los problemas que son
increblemente simple para que usted o yo a resolver, pero no tan fcil para
un ordenador. Mostrar ningn nio una foto de un gatito o un perrito y que
ser capaz de decirle muy rpidamente cul es cul. Saludar y estrechar mi
mano una maana y usted debera ser capaz de elegir de entre una multitud
de personas que al da siguiente. Pero necesita una mquina para llevar a
cabo una de estas tareas? Los cientficos ya han pasado carreras enteras
investigacin y aplicacin de soluciones complejas.
Figura 10.2
Una red neuronal es un sistema computacional conexionista. Los
sistemas computacionales que escribimos son de procedimiento; un
programa se inicia en la primera lnea de cdigo, lo ejecuta, y pasa a la
siguiente, siguiendo las instrucciones de una manera lineal. Una verdadera
red neuronal no sigue una trayectoria lineal. Ms bien, la informacin se
procesa en conjunto, en paralelo a lo largo de una red de nodos (los nodos,
en este caso, siendo neuronas).
Esta capacidad de una red neuronal para aprender, para realizar ajustes en
su estructura con el tiempo, es lo que hace tan til en el campo de la
inteligencia artificial. stos son algunos de los usos habituales de las redes
neuronales en el software de hoy en da.
10.2 El Perceptrn
Inventado en 1957 por Frank Rosenblatt en el Laboratorio de Aeronut ica
Cornell, un perceptrn es la red neural sencilla posible: un modelo
computacional de una sola neurona. A perceptrn consta de una o ms
entradas, un procesador, y una nica salida.
Entrada 0: x1 = 12
Entrada 1: x2 = 4
Peso 0: 0,5
Peso 1: -1
Entrada 1 * Peso 1 4 * -1 = -4
Suma = 6 + 2 = -4
El Perceptrn Algoritmo:
Por cada entrada implica un bucle que multiplica cada entrada por su
peso correspondiente. Puesto que necesitamos la suma, podemos sumar
los resultados en ese mismo bucle.
Mostrar Raw
Los pasos 1 y 2: Sume todas las entradas ponderadas.
float sum = 0;
for (int i = 0; i < inputs.length; i++) {
sum += inputs[i]*weights[i];
}
La funcin de activacin
int activate(float sum) {
Devolucin de un 1 si es positivo, -1 si es negativo.
if (sum > 0) return 1;
else return -1;
}
Reconocimiento 10.3 Modelo simple uso
de un Perceptrn
Ahora que entendemos el proceso de clculo de un perceptrn, podemos
ver un ejemplo de uno de cada accin. Hemos dicho que las redes
neuronales se utilizan a menudo para aplicaciones de reconocimiento de
patrones, como el reconocimiento facial. Incluso perceptrones simples
pueden demostrar los fundamentos de la clasificacin, como en el siguiente
ejemplo.
Figura 10.4
Figura 10.5
Podemos ver cmo hay dos entradas ( x y Y ), un peso para cada entrada
( peso x y peso y ), as como una neurona de procesamiento que genera la
salida.
Para evitar este dilema, nuestros perceptrn requerirn una tercera entrada,
tpicamente referido como un sesgo de entrada. Una entrada de carga
siempre tiene el valor de 1 y tambin se pondera. Aqu est nuestra
perceptrn con la adicin de la polarizacin:
Figura 10.6
Volvamos al punto (0,0). Aqu estn nuestras entradas:
0 * peso para x = 0
0 * peso para y = 0
1 * peso de sesgo = peso de sesgo
Figura 10.7
Mostrar Raw
Crear el Perceptrn.
Perceptron p = new Perceptron(3);
La entrada es de 3 valores: x, y y el sesgo.
float[] point = {50,-12,1};
La respuesta!
int result = p.feedforward(point);
Los perceptrn hacer las cosas bien? En este punto, el perceptrn no tiene
mejor que un 50/50 oportunidad de llegar a la respuesta correcta. Recuerde,
cuando la creamos, nos dimos por cada peso de un valor aleatorio. Una red
neuronal no es magia. No va a ser capaz de adivinar correctamente a menos
que nada lo enseamos cmo!
Con este mtodo, la red est provista de entradas para las que existe una
respuesta conocida. De esta manera la red puede averiguar si se ha hecho
una suposicin correcta. Si es incorrecta, la red puede aprender de su error
y ajustar sus pesos. El proceso es el siguiente:
-1 -1 0
-1 1 -2
1 -1 2
1 1 0
Con direccin, sin embargo, tuvimos una variable adicional que controla
la capacidad del vehculo para conducir: la fuerza mxima . Con una alta
fuerza mxima, el vehculo era capaz de acelerar y girar muy
rpidamente; con una fuerza menor, el vehculo podra tomar ms tiempo
para ajustar su velocidad. La red neuronal emplear una estrategia similar
con una variable llamada el aprendizaje constante. Vamos a aadir en el
aprendizaje constante de la siguiente manera:
Paso 4: Ajuste todos los pesos de acuerdo con el error y aprendizaje constante.
for (int i = 0; i < weights.length; i++) {
weights[i] += c * error * inputs[i];
}
}
Perceptron(int n) {
weights = new float[n];
Pesos comienzan al azar.
for (int i = 0; i < weights.length; i++) {
weights[i] = random(-1,1);
}
}
y = ax + b
y = 2 * x + 1
Mostrar Raw
if (y < yline) {
La respuesta es -1 si y es por encima de la lnea.
answer = -1;
} else {
answer = 1;
}
REINICIAR PAUSA
void setup() {
size(640, 360);
void draw() {
background(255);
translate(width/2,height/2);
ptron.train(training[count].inputs, training[count].answer);
Para la animacin, estamos formando un punto a la vez.
count = (count + 1) % training.length;
ejercicio 10.1
En lugar de utilizar el modelo de aprendizaje supervisado anteriormente,
se puede entrenar la red neuronal para encontrar los pesos adecuados
mediante el uso de un algoritmo gentico?
ejercicio 10.2
Visualizar el perceptrn s. Dibujar las entradas, el nodo de
procesamiento, y la salida.
Recuerde que nuestro buen amigo el vehculo de clase? Ya sabes, que uno
para la fabricacin de objetos con una ubicacin, velocidad y
aceleracin? Esto podra obedecer a las leyes de Newton con
una applyForce () la funcin y se mueven alrededor de la ventana de
acuerdo con una variedad de reglas de direccin?
PVector location;
PVector velocity;
PVector acceleration;
//etc...
Figura 10.9
Digamos que el vehculo busca todos los objetivos. De acuerdo con los
principios del Captulo 6, tendramos prxima escribir una funcin que
calcula una fuerza de direccin hacia cada destino, la aplicacin de cada
fuerza uno a la vez a la aceleracin del objeto. Suponiendo que los
objetivos son un ArrayList de PVector objetos, se vera algo as como:
Mostrar Raw
void seek(ArrayList<PVector> targets) {
for (PVector target : targets) {
Para cada objetivo, aplicar una fuerza de direccin hacia el objetivo.
PVector force = seek(targets.get(i));
applyForce(force);
}
}
Pero lo que si en vez de poder pedir nuestro cerebro (es decir perceptrn)
para disfrutar de todas las fuerzas como una entrada, procesarlos de
acuerdo con los pesos de las entradas perceptrn, y generar una fuerza de
direccin de salida? Y si pudiramos decir lugar:
Mostrar Raw
void seek(ArrayList<PVector> targets) {
Pedir a nuestro cerebro para un resultado y aplicar que a medida que la fuerza!
PVector output = brain.process(forces);
applyForce(output);
}
Aqu estamos pasando el cerebro una copia de todos los insumos (que va a
necesitar para la correccin de errores), as como una observacin acerca
de su entorno: el PVector que apunta desde su ubicacin actual a donde
desea ser. Este PVector sirve esencialmente como el error en el ms largo
es el PVector , peor es el vehculo est funcionando; cuanto ms corto,
mejor.
Entonces, el cerebro puede aplicar este vector error (que tiene dos
valores de error, una para x y una para y ) como un medio para ajustar los
pesos, tal como lo hicimos en el ejemplo de clasificacin de lnea.
tren vaco (fuerzas PVector [], error PVector) { tren vaco (flotar entradas [], in
REINICIAR PAUSA
Se aplica el resultado.
applyForce(result);
ejercicio 10.3
Visualizar los pesos de la red. Se puede intentar peso correspondiente de
cada objetivo a su brillo.
ejercicio 10.4
Pruebe diferentes reglas para el aprendizaje por refuerzo. Qu pasa si
algunos objetivos son deseables y algunos son indeseables?
Figura 10.11
Figura 10.12
Ver cmo se puede dibujar una lnea para separar las salidas verdaderos
de los falsos?
Figura 10.13
Figura 10.15
Neuron(float x, float y) {
location = new PVector(x, y);
}
void display() {
stroke(0);
fill(0);
ellipse(location.x, location.y, 16, 16);
}
}
Network(float x, float y) {
location = new PVector(x,y);
neurons = new ArrayList<Neuron>();
}
void setup() {
size(640, 360);
Hacer una red.
network = new Network(width/2,height/2);
void draw() {
background(255);
Mostrar la red.
network.display();
}
Una vez que tenemos la idea de una conexin objeto, podemos escribir
una funcin (vamos a ponerlo dentro de la Red de clase) que conecta dos
neuronas juntos, el objetivo es que, adems de hacer las neuronas en la
configuracin () , tambin podemos conectarlos .
Mostrar Raw
void setup() {
size(640, 360);
network = new Network(width/2,height/2);
network.addNeuron(a);
network.addNeuron(b);
network.addNeuron(c);
network.addNeuron(d);
}
La red , por lo tanto clase necesita una nueva funcin llamada connect
() , que hace una conexin objeto entre las dos neuronas especificados.
Mostrar Raw
void connect(Neuron a, Neuron b) {
Conexin tiene un peso aleatorio.
Connection c = new Connection(a, b, random(1));
Para que esto funcione, tenemos que aadir una ArrayList de conexiones
a la neurona clase. A continuacin, ponemos en prctica
la AddConnection () la funcin que almacena la conexin en
ese ArrayList .
Mostrar Raw
class Neuron {
PVector location;
Neuron(float x, float y) {
location = new PVector(x, y);
connections = new ArrayList<Connection>();
}
REINICIAR PAUSA
Nuestro primer paso es agregar una funcin a la red para recibir esta
entrada, lo que vamos a hacer un nmero aleatorio entre 0 y 1.
Mostrar Raw
void setup() {
Toda nuestra antigua red creada cdigo
La red, que gestiona todas las neuronas, se puede optar por el cual las
neuronas se debern aplicar esta entrada. En este caso, vamos a hacer algo
sencillo y simplemente alimentar a una sola entrada en la primera neurona
en el ArrayList , que pasa a ser ms a la izquierda uno.
Mostrar Raw
class Network {
int sum = 0;
Una vez que tenemos una copia de ese destino, podemos utilizar cualquiera
de los algoritmos de movimiento que hemos estudiado en este libro para
moverse a lo largo de este camino. Aqu, vamos a elegir algo muy simple
y justo interpolar de una a b .
Mostrar Raw
sender.x = lerp(sender.x, b.location.x, 0.1);
sender.y = lerp(sender.y, b.location.y, 0.1);
Figura 10.16
REINICIAR PAUSA
if (frameCount % 30 == 0) {
Estamos eligiendo a enviar una entrada cada 30 tramas.
network.feedforward(random(1));
}
}
class Connection {
Los datos de la conexin
float weight;
Neuron a;
Neuron b;
ejercicio 10.5
La red en el ejemplo anterior se ha configurado manualmente mediante el
establecimiento de la localizacin de cada neurona y sus conexiones con
los valores codificados de forma rgida. Reescribir este ejemplo para
generar el diseo de la red a travs de un algoritmo. Se puede hacer un
diagrama de red circular? Un azar? Un ejemplo de una red de mltiples
capas est por debajo.
REINICIAR PAUSA
ejercicio 10.6
Reescribir el ejemplo para que cada neurona realiza un seguimiento de su
avance y las conexiones hacia atrs. Se puede alimentar las entradas a
travs de la red en cualquier direccin?
ejercicio 10.7
En lugar de lerp () , utilice cuerpos en movimiento con fuerzas de
direccin para visualizar el flujo de informacin en la red.
El fin
Si todava ests leyendo, gracias! Usted ha llegado al final del libro. Pero
para todo el material que contiene este libro, apenas hemos araado la
superficie del mundo en que vivimos y de las tcnicas para la simulacin
de la misma. Es mi intencin de este libro para vivir como un proyecto en
curso, y espero seguir aadiendo nuevos tutoriales y ejemplos a la pgina
web del libro , as como ampliar y actualizar el material impreso. Su
opinin es apreciado verdad, as que por favor ponerse en contacto por
correo electrnico a (daniel@shiffman.net) o contribuyendo al repositorio
GitHub , de acuerdo con el espritu de cdigo abierto del
proyecto. Compartir su trabajo. Mantenerse en contacto. Vamos a ser dos
con la naturaleza.