jueves, 26 de noviembre de 2015

Relato corto (II): Y llegó el día...


"No hay más que un signo que testimonie que se ha comprendido todo: llorar sin motivo."

 "En este mismo momento, por todas partes, millares y millares están a punto de expirar, mientras que yo, aferrado a mi estilográfica, busco en vano una palabra para comentar su agonía."
(Emil Cioran)

Y llegó el día...

I

      No puedo creer que algo así esté ocurriendo. La pesadilla de mi juventud es ya más que una realidad. No tiene ya sentido seguir atento al televisor, porque ya está todo decidido: la muerte nos llegará a todos al cabo de unas horas, si no minutos.
      Era algo que se veía venir, pero que nadie quiso creer. Hacía décadas que todos los países se afanaban por conseguir controlar los últimos pozos petrolíferos rentables del planeta, y era cuestión de tiempo que la inestabilidad política y social que había generado el ocaso de las fuentes de energía fósiles llevase a un conflicto armado a gran escala. Sí, era algo que se veía venir...pero en realidad poco se podía hacer: todos querían lo poquito que quedaba, y nadie daría su brazo a torcer. 
      Así que finalmente llegó el día. La humanidad tiene los minutos contados, o; al menos, los tiene su civilización. Y, claro, hay rumores de bunkers aquí y allá, y es cierto que muchos que habían previsto este desenlace y que disponían de recursos suficientes, han creado fortificaciones bastantes bien preparadas...pero de nada serviría aguantar un año o dos debajo de tierra cuando todo el arsenal nuclear de que disponen las potencias mundiales esta ahora mismo volando hacia su destino. Es un hecho que en los últimos tiempos la proliferación de armas nucleares se ha incrementado por diez, sin duda como un intento por repetir la estabilidad que la seguridad en la aniquilación mutua consiguió en el siglo XX; pero finalmente esta proliferación sólo va a servir para que sean hoy miles las nuevas bombas nucleares que caigan, produciendo luego la mayor lluvia radiactiva imaginable. Cualquiera que sobreviva al día de hoy, estará condenado a una breve y tormentosa existencia el día de mañana...

II

      Una bomba de hidrógeno había arrasado una ciudad americana hacía unas horas (se cree que ha sido Washington D.C., pero no se sabe con seguridad), y ya se ven desde mi casa las estelas que los misiles dejan tras de sí. Todo ha comenzado...y ahora tengo que afrontar el hecho de morir abrasado dentro de unos minutos.
      Mis dos hijas están junto a mí, y mi esposa llora abrazando a mis tres nietos. Todos sabemos lo que nos esperaba a continuación, menos estas tres personitas que no llegarán ni de lejos a la adolescencia: están serios y nos observaban, desde su inocencia, sin comprender bien el porqué del llanto y la desesperación de sus mayores. Aunque, siendo sinceros, yo tampoco comprendo bien el porqué de la agonía que nos espera a tantos y tantos desgraciados en unos segundos: todo por el petróleo...todo por el interés, por querer acaparar el mayor número de recursos posibles...todo por culpa, sin duda, de la propia naturaleza humana. 
      Tengo en estos momentos 76 años de edad, y hace ya mucho tiempo que no le presto atención a cuestiones científicas ni filosóficas (desde hace años simplemente me dejo llevar), pero recuerdo claramente aquella época en que no paraba día y noche de pretender entender el mundo. Eso fue hasta que me pareció que más o menos ya lo comprendía todo. Desde ese momento, me limito a un llanto intelectual interno: ese llanto sin motivo que es señal, dicen, de sabiduría. Sí...hacía ya mucho que había comprendido lo absurdo de la existencia, y también el sinsentido del "sentido" evolutivo que conforma nuestra esencia. Porque es esta misma esencia, este ímpetu natural y compartido por todo ser vivo de querer y necesitar acaparar y consumir recursos lo que había finalmente desestabilizado nuestra convivencia social. Sí, desgraciadamente era inevitable que esto ocurriera: nuestra naturaleza es la causa natural de que ahora mismo miles de artefactos con cargas nucleares estén aniquilando a miles de millones de personas...¡Por Dios, suena tan increíble! Ni siquiera viendo, como estoy en este instante, volar literalmente estas armas puedo creer que la humanidad vaya a desaparecer en unos instantes. Por favor, ¡tanto dolor para qué!...


III

      Ya tiembla el suelo. No se ve desde el patio de mi casa aún ninguna bola de fuego ni nada similar, pero el suelo tiembla. Seguramente algún misil habrá caído a varios cientos de kilómetros. El próximo seguramente será visible...¡No!, por favor, que esto pare antes, no quiero ver llegar una bola de fuego hacia mis familias, ¡no quiero ver como se abrasan vivos, joder! Si tuviese ahora mismo aquí una pistola acabaría con nuestras vidas antes de tener que ver este desenlace...pero, no; creo que lo tendré que presenciar todo, y es poco probable que un proyectil impacte lo suficientemente cerca de mi zona como para que la muerte sea instantánea: ¡Oh, Dios! Estamos jodidos.
     No hay nada que hacer, ni ningún sitio al que correr. Lo único que queda es abrazarse y llorar. Así que me limito a aferrarme a mis seres queridos, y a mirar desde el jardín de mi casa hacia el cielo. Sólo queda esperar con el corazón encogido el lugar desde el que la muerte nos llegará. Tantos años vividos; tantos años de sacrificio y lucha para terminar así, viendo morir a toda mi familia, viendo morir a aquello que le ha dado sentido a mi vida desde hace más de 50 años.
    ¡Joder! ¡Ha tenido que caer uno cerca!, se puede ver a lo lejos la forma de ese hongo atómico que tantas veces hemos visto en la televisión y en las películas. El suelo tiembla mucho, y el cielo ha cambiado de color por completo: ¿será este el que nos mate? ¡Dios! ¡Para qué, joder! ¿Para qué ha servido la existencia? ¿Para qué fue la constante y vehemente lucha que durante milenios ha padecido la raza humana? ¿Ha hecho acaso la humanidad algo que merezca la pena a parte de parir hijos y consumir recursos, algo de interés que vaya a sobrevivir hoy nuestra extinción? ¡¡Para qué entonces tanto dolor!!...¡Ahí viene! Mierda, no, ahí viene el fuego, ¡joder!:
-¡Mary, ven! ¡Trae a las niñas, Mary! Venid todos abrazarme, fuerte. No pasa nada, ¡no pasa nada! No miréis, no miréis allí, mirarme a mí. No va a pasar nada, ¿vale? Cuando todo esto pase todo será mejor. Será como cuando estamos en un profundo sueño, ¿comprendéis? No tengáis miedo a la muerte. Todo será como antes de nacer, ¿vale? ¿Me entendéis? Dejaremos de existir y todo terminará: no más dolor ni más miedo. Venga, venid aquí, ¡vamos a abrazarnos todos! Y no miréis, ¿vale?...
- Samuel, ¡hace calor!...
- ¡Mary, cálmate preciosa! ¡Tranquila! ¡Ya pasa todo, chicas! Ya pasa, tranquilas.
- ¡¡Papi!!
- ¡Samuel!
- ¡Os quiero! ¡¡Lo siento mucho!! ¡Os quierooooo!...


IV

     Inesperadamente, un último pensamiento está cruzando mi atormentada mente. Un recuerdo que debía tener almacenado en el subconsciente y que ahora brota en mi cabeza. Se trata extrañamente de una famosa frase que leí hace años. Concretamente, de uno de los aforismos del filósofo Emil Cioran: "Ya se trate del individuo o de la humanidad en su conjunto, no se debe confundir avanzar y progresar, a menos de admitir que ir hacia la muerte sea un progreso."...y de hecho en un segundo voy a morir junto al resto de la humanidad.


martes, 24 de noviembre de 2015

Algunos aforismos de Emil Cioran


Algunos aforismos de Emil Cioran (de su obra, El aciago Demiurgo):

Una vida plena no es, en el mejor de los casos, más que un equilibrio de inconvenientes.

Ya se trate del individuo o de la humanidad en su conjunto, no se debe confundir avanzar y progresar, a menos de admitir que ir hacia la muerte sea un progreso.


Todo el mundo vive en y del proyecto, consecuencia del no saber: obnubilación metafísica que alcanza las dimensiones de la especie. Para el que no está obnubilado, el futuro y, con mayor razón aún, todo acto que se inserte en él, no es más que engaño, espejismo generador de asco y de espanto.


El caído es un hombre como todos nosotros, con la diferencia de que no se ha dignado a jugar el juego. Le criticamos y le huimos, le guardamos rencor por haber revelado y expuesto nuestro secreto, le consideramos a justo título como un miserable y un traidor.


En este mismo momento, por todas partes, millares y millares están a punto de expirar, mientras que yo, aferrado a mi estilográfica, busco en vano una palabra para comentar su agonía.


El lugar que uno ocupa en el Universo: ¡un punto, y ni siquiera! ¿Por qué zarandearse cuando visiblemente se es tan poco? Hecha esta constatación se calma uno en seguida: en el futuro, no más preocupaciones, no más alocamientos metafísicos o de otra clase. Y, después, este punto se dilata, se hincha, sustituye al espacio. Y todo vuelve a empezar.

No hay más que un signo que testimonie que se ha comprendido todo: llorar sin motivo.

No hay que tomarse nada a pecho -se repite quien se enoja consigo mismo cada vez que sufre y no pierde ninguna ocasión de sufrir.


Frívolo y disperso, aficionado en todos los campos, no habré conocido a fondo más que el inconveniente de haber nacido.


Habría que decirse y repetirse que todo lo que nos alegra o nos aflige no corresponde a nada, que todo es perfectamente irrisorio y vano. ...Pues bien, me lo digo y me lo repito cada día y no por ello dejo de alegrarme o afligirme.


sábado, 21 de noviembre de 2015

Experimento en favor de la teoría de Jeremy England (III)


Encendemos un termostato sobre un recipiente de volumen constante con un gas monoatómico en su interior siguiendo un potencial Lennard-Jones.

Dicho potencial tienen una componente positiva que resulta en una fuerza repulsiva actuando a pequeñas distancias entre partículas (simulando el resultado de la sobreposición de los orbitales electrónicos, conocido como la repulsión de Pauli). De esta manera, las partículas no puede solaparse a partir de cierta distancia mínima. Por otra parte, hay una componente negativa del potencial que simboliza una fuerza atractiva que actúa a mayores distancias entre partículas (simulando la fuerza de Van Der Waals, o fuerza de dispersión).



Comportamiento normal del sistema en estas condiciones.

Si comenzamos con un sistema de N partículas monoatómicas inicialmente en reposo, al activar el termostato a una determinada temperatura kT, el sistema comienza a adquirir energía cinética y las partículas van adquiriendo velocidad. El potencial L-J descrito decide más tarde cómo se producen las fuerzas interacción entre partículas (evitando solapamiento, y favoreciendo la atracción mutua entre pares en relación inversa a su distancia).

Si el termostato se mantiene fijo en la misma temperatura kT, pasado un cierto número de segundos el sistema alcanza un equilibrio térmico caótico de máxima entropía: en este punto no se observan ya grandes variaciones en las medidas energéticas y de velocidad.


Esta sucesión de acontecimientos es la que se observa siempre que se repite el experimento no importa el número de veces que se realice, ni el tiempo que se espere. El hecho de que un fenómeno complejo ocurra en estas condiciones, como por ejemplo que N / 2 partículas se agrupen muy cerca unas de otras es casi imposible dada las pocas configuraciones que muestran este estado en comparación con los billones de configuraciones que presentan un estado caótico como el observado.

viernes, 20 de noviembre de 2015

¡Nuevo paper de Jeremy England!

"You start with a random clump of atoms, and if you shine light on it for long enough, it should not be so surprising that you get a plant." Jeremy England (2014), interview commentary with Natalie Wolchover

¡Acabo de comprobar que han publicado un nuevo paper del físico del MIT (Massachusetts Institute of Technology), Jeremy England!

Esto puede no significar mucho para la mayoría de vosotros (xDD), pero para mí es una noticia extraordinaria porque llevo ya tiempo siguiendo el trabajo de este autor y llevaba todo este 2015 esperando una nueva publicación.

Por si hay algún interesado, el trabajo es el siguiente:

England, J. L. "Dissipative Adaptation in Driven Self-assembly." Nature Nanotechnology, 10, 920 (2015)

En cuanto me lo empape a fondo prometo hacer un artículo divulgativo en este blog. También ha participado en este otro paper:

Brock, K. P., Abraham, A., Amen, T., Kaganovich, D. and England, J. L. "Structural Basis for Modulation of Quality Control Fate in a Marginally Stable Protein."  Structure, 23, 1169 (2015).

¡Un saludo!


Revisión del experimento en favor de la teoría de Jeremy England

"You start with a random clump of atoms, and if you shine light on it for long enough, it should not be so surprising that you get a plant."
Jeremy England (2014), interview commentary with Natalie Wolchover

Hace unos meses terminé de estudiar a fondo el interesante trabajo que el físico Jeremy England está realizando en el MIT (Massachusetts Institute of Technology). En mi blog he divulgado todo lo referente a este trabajo con mucho nivel de detalle, siendo quizás esta entrada el mejor resumen de su teoría.

En un intento de apoyar su propuesta de abiogénesis, realicé un experimento de simulación por computador siguiendo la siguiente propuesta:

1) Programamos un sistema físico que simule lo mejor posible la realidad física.
2) Programamos un modo de calcular la energía del sistema conforme el sistema evoluciona en el tiempo.
3) Procedemos a buscar sistemas complejos mediante computación evolutiva.
4) Calculamos el calor disipado en la formación de tales sistemas ordenados.
5) Estudiamos si existe correlación en esta simulación, entre la complejidad alcanzada y el calor disipado.

Y para reforzar aún más el estudio experimental, procedemos de nuevo, pero sustituyendo el paso 3) y 4) por lo siguiente:

3) Procedemos a buscar sistemas que disipen poco calor mediante computación evolutiva.
4) Calculamos la complejidad del sistema cuando se disipa poco calor.

Si la correlación propuesta entre complejidad y calor disipado es correcta, los sistemas complejos deberán de ir siempre (en la práctica) acompañados de una gran cantidad de calor disipado (energía útil consumida).

¡Y fue precisamente esto lo que he observado cuando he realizado este experimento!

Revisión del código fuente.

Puedes obtener más información sobre este trabajo en el enlace original del artículo que escribí al respecto, pero quiero introducir a continuación la revisión del código fuente que desinteresadamente ha realizado un lector del blog. Carlos Manuel se ha encargado de poner un poco en limpio mi código fuente original, y ha añadido comentarios y algunas nuevas gráficas que clarifican aún más el tema tratado.

Os dejo un enlace al repositorio Git que Carlos ha creado para compartir el programa: https://github.com/CarlosManuelRodr/LennardJones-Evolutivo

Trabajo futuro.

Comentar también, que actualmente estoy trabajando en una nueva versión de este experimento, pero utilizando simulaciones en 3D (en lugar de las 2D del código previo). En cuanto tenga algo consistente escribiré una nueva entrada ;).

Un saludo a todos.

domingo, 15 de noviembre de 2015

Trasteando con el motor de Inteligencia Artificial de Google (TensorFlow)

"Cuando entendamos el cerebro, la humanidad se entenderá a sí misma" (Rafael Yuste)

Hace unos días, Google ha decidido liberar su motor de inteligencia artificial más actual: el conocido como TensorFlow.

Esta librería ha sido, de hecho, la utilizada por los chicos de Mountain View para desarrollar el software más avanzado hasta estos momentos relacionados con la IA: por mencionar unos pocos ejemplos, valga decir que Google ha usado TensorFlow para desarrollar su Google Translator, GoogleFotos, su novedoso Smart Reply, el reconocimiento de voz para Android, el proyecto que le permite poseer el mejor software hasta el momento en cuanto a localización y reconocimiento de objetos dentro de una imagen (Inception), etc., etc.

Pues bien, ni corto ni perezoso, no pude evitar abalanzarme sobre esta maravillosa herramienta, y aprovechar la abundante documentación ofrecida en la web oficial del proyecto para aprender a manejar semejante maravilla tecnológica en el terreno del software.

Y qué mejor modo de hincar el diente a esta herramienta que reescribiendo un ejemplo que realicé desde cero (y sin usar ningún framework) hace unos meses. Me refiero en concreto al ejemplo mediante el cual conseguí entrenar una red neuronal para que fuese capaz de aprender de manera autónoma a sumar dos unidades de enteros. Podéis ver todo lo relacionado con este ejemplo en esta entrada del blog: http://quevidaesta2010.blogspot.com.es/2015/04/aprendizaje-funcional-automatico.html

Así pues, el objetivo era conseguir realizar la misma tarea, pero usando esta vez la API desarrollada por Google, y comprobar de primera mano qué curva de aprendizaje requiere, y como de accesible es la susodicha y famosa herramienta...

Resultado: ¡es una verdadera maravilla!

La versatilidad, el enorme número de utilidades disponibles, el modo en que lo han enfocado todo alrededor de modelos basados en operaciones dentro de nodos en un grafo, la documentación que ofrecen, la potencia de poder utilizar para los cálculos varias GPU además de procesadores, e incluso poder distribuir dichos grafos en un cluster de máquinas funcionando en paralelo (aunque esta funcionalidad distributiva no la han liberado aún). En resumen:  esta herramienta es una verdadera revolución, y una muestra más de que Google siempre intenta hacer las cosas bien.

Sin entrar mucho en detalles, os dejo a continuación el código fuente capaz de hacer la misma tarea programada aquí (es decir, entrenar una red neuronal para que aprenda de manera autónoma a sumar dos operandos), pero mediante los modelos basados en grafos de TensorFlow:

Grafo dirigido utilizado en un ejemplo de TensorFlow
Se trata de una red neuronal con 20 nodos de entrada, una capa intermedia de otros 20 nodos, y un nodo más para el resultado de salida. En total 420 pesos entre nodos (el equivalente a 420 "sinapsis" entre neuronas).

He separado el código en tres ficheros: uno para el entrenamiento de la red y el almacenamiento de la misma, otro para recuperar una red previamente entrenada en algún momento y usarla para probar su eficacia, y un último fichero de utilidades donde agrupo algunas funciones auxiliares.

Para probar este código, lo recomendable es seguir primero las instrucciones de instalación del paquete de TensorFlow que los chicos de Google especifican aquí.

Una vez instalada la herramienta, simplemente debes abrir tu IDE para Python favorito (yo uso Ninja IDE), y copiar el código que os dejo a continuación:

1) entrenamiento_modelo.py:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import utilidades as util
import tensorflow as tf

# Definimos las constantes del modelo
flags = tf.app.flags
flags.DEFINE_integer("operando_maximo", 9, "Mayor valor que puede tomar un operando de la suma.")
flags.DEFINE_integer("nodos_red", 20, "Numero de nodos de la red neuronal.")
FLAGS = flags.FLAGS

# Inicializamos la sesion
sess = tf.InteractiveSession()

# Definimos el modelo de la red neuronal
x = tf.placeholder("float", shape=[FLAGS.nodos_red, None])
y_ = tf.placeholder("float")
y = tf.placeholder("float")

# Primera capa (layer) de FLAGS.nodos_red nodos que reciben entradas de FLAGS.nodos_red inputs de x, y
# dan salida (output) a FLAGS.nodos_red conexiones h1i
W = tf.Variable(tf.constant(0.2, shape=[1, FLAGS.nodos_red]))
b = tf.Variable(tf.constant(0.1, shape=[FLAGS.nodos_red]))
h1i = tf.nn.l2_normalize(tf.matmul(x, W) + b, 0, epsilon=1e-12, name=None)

# Segunda capa de 1 nodo que recibe como entrada la salida de los FLAGS.nodos_red nodos h1i
# de la primera capa, y conecta su salida al nodo respuesta y de la red neuronal
Wf = tf.Variable(tf.constant(0.2, shape=[FLAGS.nodos_red, 1]))
bf = tf.Variable(tf.constant(0.1, shape=[1]))
hf = tf.matmul(h1i, Wf) + bf

# Nodo de respuesta de la red
y = tf.reduce_sum(hf)

# Inicializamos las variables del modelo (Inicialmente los pesos se inicializan
# con valores constantes de tipo float = 0.2 y 0.1)
sess.run(tf.initialize_all_variables())

# Establecemos el nodo del grafo encargado del entrenamiento de la red neuronal
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(tf.abs(tf.sub(y_, tf.floor(y))))

# Establecemos los nodos del grafo encargados de la verificacion del aprendizaje logrado
correct_prediction = tf.equal(y_, tf.floor(y))
accuracy = tf.reduce_sum(tf.cast(correct_prediction, "float"))
diffe = tf.cast(tf.add(tf.floor(y), 0), "float")

# Realziamos el entrenamiento ejecutando (run) el nodo de entrenamiento train_step repetidas veces
for i in range(5000):
    x_train, y_train = util.random_simple_operacion_size(FLAGS.nodos_red, 0, FLAGS.operando_maximo)
    train_step.run(feed_dict={x: x_train, y_: y_train})
    if i % 500 == 0:
        train_accuracy = accuracy.eval(feed_dict={x: x_train, y_: y_train})
        print "Paso %d(de 5000) del entrenamiento..." % (i)


# Probamos la eficiencia conseguida con el entrenamiento
print "\nEficiencia conseguida: "
k = 0
for j in range(100):
    x_prueba, y_prueba = util.random_simple_operacion_size(FLAGS.nodos_red, 0, FLAGS.operando_maximo)
    if accuracy.eval(feed_dict={x: x_prueba, y_: y_prueba}) == 1:
        k = k + 1
print "Numero de aciertos igual a %i (de 100 intentos)" % (k)

# Guardamos las variables de la red neuronal entrenada para su futuro uso
saver = tf.train.Saver()
saver.save(sess, "suma-model.ckpt")

2) uso_modelo_entrenado.py:


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import utilidades as util
import tensorflow as tf

# Definimos las constantes del modelo
flags = tf.app.flags
flags.DEFINE_integer("operando_maximo", 9, "Mayor valor que puede tomar un operando de la suma.")
flags.DEFINE_integer("nodos_red", 20, "Numero de nodos de la red neuronal.")
FLAGS = flags.FLAGS

# Inicializamos la sesion
sess = tf.InteractiveSession()

# Definimos el modelo de la red neuronal
x = tf.placeholder("float", shape=[FLAGS.nodos_red, None])
y_ = tf.placeholder("float")
y = tf.placeholder("float")

# Primera capa (layer) de FLAGS.nodos_red nodos que reciben entradas de FLAGS.nodos_red inputs de x, y
# dan salida (output) a FLAGS.nodos_red conexiones h1i
W = tf.Variable(tf.constant(0.2, shape=[1, FLAGS.nodos_red]))
b = tf.Variable(tf.constant(0.1, shape=[FLAGS.nodos_red]))
h1i = tf.nn.l2_normalize(tf.matmul(x, W) + b, 0, epsilon=1e-12, name=None)

# Segunda capa de 1 nodo que recibe como entrada la salida de los FLAGS.nodos_red nodos h1i
# de la primera capa, y conecta su salida al nodo respuesta y de la red neuronal
Wf = tf.Variable(tf.constant(0.2, shape=[FLAGS.nodos_red, 1]))
bf = tf.Variable(tf.constant(0.1, shape=[1]))
hf = tf.matmul(h1i, Wf) + bf

# Nodo de respuesta de la red
y = tf.reduce_sum(hf)

# Nodo de evaluacion del resultado
diffe = tf.cast(tf.add(tf.floor(y), 0), "float")

# Vamos a recuperar una red neuronal previamente entrenada.
saver = tf.train.Saver()
saver.restore(sess, "suma-model.ckpt")

# Iremos pidiendo los operandos por teclado y observando el resultado
print "\nIntroduce ahora los operandos para probar la red neuronal previamente entrenada:"
while True:
    pedir_operando = "Introduce un entero entre 0 y " + str(FLAGS.operando_maximo) + " (-1 para salir): "
    op1 = input(pedir_operando)
    if op1 == -1:
        break
    op2 = input(pedir_operando)
    if op2 == -1:
        break
    resultado = op1 + op2
    print "\nLa suma real es: %i + %i = %i" % (op1, op2, resultado)
    x_prueba, y_prueba = util.simple_operacion_size(FLAGS.nodos_red, op1, op2)
    print "Las suma prevista por la red neuronal es: %i + %i = %i" % (op1, op2, diffe.eval(feed_dict={x: x_prueba, y_: y_prueba}))

3) utilidades.py:


  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import numpy as np


def random_operaciones(size):
    x_res = np.zeros((0, 20))
    y_res = np.zeros((0, 1))
    for i in range(size):
        operando1 = np.random.randint(0, 9)
        operando2 = np.random.randint(0, 9)
        aux_x = np.array([])
        for j in range(10):
            if operando1 > j:
                aux_x = np.append(aux_x, np.array([1]))
            else:
                aux_x = np.append(aux_x, np.array([0]))
        for j in range(10):
            if operando2 > j:
                aux_x = np.append(aux_x, np.array([1]))
            else:
                aux_x = np.append(aux_x, np.array([0]))
        resultado = operando1 + operando2
        aux_y = np.array([resultado])
        x_res = np.insert(x_res, 0, np.array(aux_x), axis=0)
        y_res = np.insert(y_res, 0, np.array(aux_y), axis=0)
    return x_res, y_res


def random_simple_operacion():
    x_res = np.zeros((20, 0))
    y_res = np.zeros((0, 1))

    operando1 = np.random.randint(0, 9)
    operando2 = np.random.randint(0, 9)
    aux_x = np.array([])
    for j in range(10):
        if operando1 > j:
            aux_x = np.append(aux_x, np.array([1]))
        else:
            aux_x = np.append(aux_x, np.array([0]))
    for j in range(10):
        if operando2 > j:
            aux_x = np.append(aux_x, np.array([1]))
        else:
            aux_x = np.append(aux_x, np.array([0]))
    resultado = operando1 + operando2
    aux_y = np.array([resultado])
    x_res = np.insert(x_res, 0, np.array(aux_x), axis=1)
    y_res = np.insert(y_res, 0, np.array(aux_y), axis=0)
    return x_res, y_res


def random_simple_operacion_size(size, min, max):
    x_res = np.zeros((size, 0))
    y_res = np.zeros((0, 1))

    operando1 = np.random.randint(min, max)
    operando2 = np.random.randint(min, max)
    aux_x = np.array([])
    for j in range(size / 2):
        if operando1 > j:
            aux_x = np.append(aux_x, np.array([1]))
        else:
            aux_x = np.append(aux_x, np.array([0]))
    for j in range(size / 2):
        if operando2 > j:
            aux_x = np.append(aux_x, np.array([1]))
        else:
            aux_x = np.append(aux_x, np.array([0]))
    resultado = operando1 + operando2
    aux_y = np.array([resultado])
    x_res = np.insert(x_res, 0, np.array(aux_x), axis=1)
    y_res = np.insert(y_res, 0, np.array(aux_y), axis=0)
    return x_res, y_res


def simple_operacion(op1, op2):
    x_res = np.zeros((20, 0))
    y_res = np.zeros((0, 1))

    operando1 = op1
    operando2 = op2
    aux_x = np.array([])
    for j in range(10):
        if operando1 > j:
            aux_x = np.append(aux_x, np.array([1]))
        else:
            aux_x = np.append(aux_x, np.array([0]))
    for j in range(10):
        if operando2 > j:
            aux_x = np.append(aux_x, np.array([1]))
        else:
            aux_x = np.append(aux_x, np.array([0]))
    resultado = operando1 + operando2
    aux_y = np.array([resultado])
    x_res = np.insert(x_res, 0, np.array(aux_x), axis=1)
    y_res = np.insert(y_res, 0, np.array(aux_y), axis=0)
    return x_res, y_res


def simple_operacion_size(size, op1, op2):
    x_res = np.zeros((size, 0))
    y_res = np.zeros((0, 1))

    operando1 = op1
    operando2 = op2
    aux_x = np.array([])
    for j in range(size / 2):
        if operando1 > j:
            aux_x = np.append(aux_x, np.array([1]))
        else:
            aux_x = np.append(aux_x, np.array([0]))
    for j in range(size / 2):
        if operando2 > j:
            aux_x = np.append(aux_x, np.array([1]))
        else:
            aux_x = np.append(aux_x, np.array([0]))
    resultado = operando1 + operando2
    aux_y = np.array([resultado])
    x_res = np.insert(x_res, 0, np.array(aux_x), axis=1)
    y_res = np.insert(y_res, 0, np.array(aux_y), axis=0)
    return x_res, y_res

Hay que utilizar primero entrenamiento_modelo.py hasta que obtengas los resultados de entrenamiento deseado. Posteriormente, ya pueder ejecutar uso_modelo_entrenado.py para comprobar qué responde la red neuronal entrenada a las operaciones que tú le vayas indicando.

Evidentemente, este ejemplo no es nada representativo de las enormes posibilades de TensorFlow (posibiliades que podéis comprobar mejor simplemente observando la capacidad que tiene un simple móvil Android para reconocer nuestra voz y transcribir lo que decimos en palabras), pero sí me ha servidor para hacerme con el funcionamiento de la herramienta. Prometo desarrollar y publicar algo más potente e interesante próximamente :).

Y nada más, por ahora. Sólo comentar que cualquiera que se quiera iniciar en el uso TensorFlow puede contactar conmigo y le ayudaré en todo lo que pueda.

Un saludo a todos.

sábado, 7 de noviembre de 2015

El acertado miedo de Stephen Hawking

 «La inteligencia artificial podría significar el fin de la raza humana» (Stephen Hawking)

Hace unas semanas, el famoso físico Stephen Hawking (junto a otros 1000 colegas científicos) alertaban sobre el supuesto peligro que supone el avance en robótica e inteligencia artificial para la supervivencia del ser humano [1]. Y la cuestión es que no va desencaminada la cosa.

Está en nuestra naturaleza vernos como el centro de la creación y del Universo, pero realmente sólo somos un producto más del proceso evolutivo, y el hecho de que nuestra especie finalmente pueda desaparecer como ya lo han hecho millones de especies anteriormente aquí en la Tierra es muy posible. De hecho, dado que el tiempo de vida que le queda al Universo antes de la muerte térmica es varios órdenes de magnitud superior al ya transcurrido desde el Big Bang, es casi una certeza la situación en la que la especie humana termine desapareciendo; y probablemente lo hará más pronto que tarde (a escala cosmológica).

Y puestos a imaginar el motivo de nuestra extinción, hay varias alternativas quizás más destacadas que las demás: un meteorito, una guerra nuclear a gran escala, una erupción volcánica en cadena de grandes dimensiones, una enfermedad mortal con una fácil transmisión por aire ...y los robots ;). Sé que suena a ciencia ficción (y de momento es cierto que no es más que una hipótesis ficticia), pero la idea no es tan absurda como pueda parecer. La tecnología robótica y de IA es joven, pero avanza a muy buen ritmo, y es posible que en 50 ó 100 años se comiencen a ver complejas conciencias artificiales (de casi idénticas capacidades cognitivas que las humanas).

Pero no se trata sólo de una posibilidad, sino que incluso se puede defender teóricamente que esta rebelión artificial está determinada por las reglas del mundo, y que es pue, inevitable que tarde o temprano ocurra (si no desaparecemos antes por otras causas). Veamos esta propuesta en profundidad:

Las leyes ontológicas del mundo.

En el mundo hay dos importantes reglas o leyes que tienen un carácter ontológico, y que determinan lo que puede y lo que no puede ocurrir de un modo espontáneo en el Universo. Se trata de la segunda ley de la termodinámica (la entropía o desorden global siempre debe ir en aumento en el tiempo ΔS > 0), y el hecho de que la energía disponible (energía libre, entalpía libre, o  energía de Gibbs) siempre tiende a disminuir globalmente (ΔG < 0). Estas dos reglas dictan, como decimos, qué es posible y qué no lo es en el comportamiento físico del mundo y en las reacciones químicas entre elementos.

Relación entre complejidad y energía libre.

Son muchos los investigadores de actualidad y renombre que basan toda la evolución ocurrida en el Universo (a todos los niveles) sobre estas dos reglas: por nombrar a unos pocos, tenemos a Nick LaneAddy Pross, y por supuesto a Jeremy England [2][3][4]. Esta lista es bastante más extensa, y todo parece indicar que en las próximas décadas comenzará a emerger consenso en la comunidad científica a favor de la propuesta de que el origen y evolución de la vida es parte de un proceso físico global más amplio que implica una sencilla regla de base:

Esta sencilla regla sobre la que se cimentaría toda posible evolución, nos dice que el Universo (guiado por sus leyes ontológicas), debe obedecer siempre el siguiente mandamiento: "La energía disipada o utilizada en la formación de estructuras físicas, debe ser siempre tal que haga disminuir la energía útil global del Universo".

Es decir, que para que sea posible la ocurrencia de cualquier fenómeno (incluidos aquellos estructuralmente complejos, como por ejemplo la vida biológica), es necesario que la energía consumida supere siempre cierto umbral que va estrictamente relacionado con la cantidad de orden implicado. Matemáticamente la cosa es así:


El primer miembro de la derecha es la entalpía, que representa la cantidad de energía consumida o cedida al medio, y el segundo término representa la complejidad presente en un sistema. Como el Universo tiende siempre a ΔG < 0; para que se pueda producir un gran descenso en la entropía, con el consiguiente aumento de orden estructural (ΔS << 0), la entalpía H (cantidad de energía intercambiada con el entorno) debe contrarrestar ese aumento de orden S, y no sólo eso, sino que dicha entalpía (dicho consumo energético), debe mantenerse en el tiempo así de alta si se quiere mantener el orden logrado. Esto significa que, si una vez logrado cierto nivel de complejidad, el consumo de energía se detiene, la estructura se viene abajo y pierde su complejidad (ΔS > 0) en valor suficiente hasta que ΔG sea menor que 0 de nuevo.

De hecho, cabe señalar aquí que la muerte de un ser vivo no es ni más ni menos que el descenso en la capacidad de dicho organismo (debido a cambios en su estructura física) para obtener y consumir le energía necesaria para mantener su alta entropía (S), lo que lleva a que la compleja estructura se pierda, y el ser vivo se desintegre. Podemos decir por tanto que eso constituye la muerte: el proceso espontáneo que ocurre cuando el orden de un cuerpo es mayor que su capacidad para mantener la energía útil global del Universo en descenso (ΔG < 0).

¿Qué es la vida?

El Universo, como vemos, tiende siempre a toda costa a que la cantidad de energía útil para producir trabajo neto vaya disminuyendo en el tiempo (o, en otras palabras, el mundo tiende a consumir de manera constante todo el trabajo potencial disponible en su realidad). Y aunque son muchos los tipos de fenómenos que pueden ocurrir en el Universo de un modo espontáneo, dichos fenómenos se pueden agrupar en dos grandes grupos:

1) Aquellos que hacen disminuir constantemente la energía útil mediante la disminución neta
de orden en el mundo (aumentado la entropía global ΔS > 0 del Universo). Como por ejemplo el fenómeno de dispersión de un gas en un sistema.

2) Y aquellos que hacen disminuir en el tiempo la energía útil global disponible, mediante la formación de estructuras físicas eficientes consumidoras de trabajo. Estos fenómenos consisten en ser estructuras poco caóticas (bastante ordenadas ΔS < 0), pero cuya eficiencia en el consumo energético supera en mucho la disminución local entrópica que su estructura le supone al mundo. Este grupo de fenómenos es muy heterogéneo, e incluye fenómenos complejos como la vida biológica, los huracanes y torbellinos, patrones naturales como las corrientes seguidas por el agua de los ríos y las dunas de arena, complejas organizaciones sociales de ciertos animales (hormigas, humanos), etc.

El primer grupo engloba así, a todos aquellos fenómenos que implican caos y dispersión (con el consiguiente consumo de energía potencial asociado), y el segundo grupo engloba los fenómenos que poseen bajo caos y desorden, pero alto consumo energético directo. Sin embargo, mientra que los fenómenos del primer grupo ocurren fácilmente de un modo inmediato (como cuando una copa de cristal se hace trizas al caer al suelo, o cuando el calor de un cuerpo se transmite hacia los objetos de su entorno), los fenómenos ordenados pero que son grandes consumidores de energía son complicados de acontecer.

Esta dificultad se relaciona precisamente debido a la necesidad estructural que supone una alta densidad de consumo energético (cantidad consumida por unidad de área del fenómeno): es decir; ¡que se requiere un importante aumento en el orden local (complejidad) para lograr esta gran eficiencia disipativa global! Pero como hemos visto, el Universo tiende, siguiendo la segunda ley de la termodinámica, a estados de bajo orden (ΔS > 0), por lo que la aparición de un fenómeno complejo  (ΔS < 0) que sea eficiente consumidor de energía, a pesar de ser un fenómeno muy estable una vez alcanzado, es precisamente una tarea complicada de llevar a cabo: ¡esta es la razón de que no veamos la aparición de fenómenos complejos por doquier en el Universo, pero que sí observemos el hecho de que, cuando finalmente aparece, este fenómeno complejo es  SIEMPRE un eficiente consumidor de energía, y además siempre se trata de un fenómeno bastante estable en el tiempo mientras tenga acceso a energía externa que consumir!

La vida aquí en la Tierra no es más, pues, que un proceso complejo pero gran eficiente acaparador
de energía: un fenómeno natural del segundo grupo que hemos estudiado algunos párrafos más arriba. De hecho, la vida biológica es tan eficiente en la tarea de consumir energía y disipar calor, que una simple bacteria es más eficiente (más densa energéticamente hablando) que nuestro propio Sol: es decir; que por unidad de área, un trocito de Sol del tamaño de una bacteria, por ejemplo, es incapaz de producir tanto calor como consigue una bacteria o, visto de otra manera, que una hipotética bacteria que tuviese el tamaño del Sol, produciría muchísimo más calor que éste.

Y como la vida es tan buen consumidor de energía (energía que transforma en calor mediante trabajo mecánico), es normal que sea un fenómeno muy estable en el tiempo siempre que tenga energía disponible que acaparar pero, ¿cómo se alcanzó en un primer momento la compleja estructura espacial que los seres vivos presentan? ¿cómo se originó pues aquí en la Tierra este fenómeno local tan complejo y tan poco probable?

La respuesta es clara: mediante un gradual proceso de aumento de complejidad y eficiencia respetando las dos leyes ontológicas que ya hemos estudiado. Un proceso que se denomina evolución, y que no sólo aplica a los organismos biológicos ya existentes como se suele pensar, ¡sino que aplica, como veremos luego, a todos y cada uno de los fenómenos que hemos agrupado y clasificado antes en el segundo grupo de fenómenos!

Evolución.

Pese a la costumbre de pensar de esta forma, la evolución, como decimos, no sólo aplica a los organismos vivos terrestres, sino que aplica a cualquier fenómeno o estructura física compleja aparecida en el Universo. El concepto es sencillo: cuando se dan las condiciones físicas adecuadas (que varían según el fenómeno de estudio), el proceso natural evolutivo comienza una gradual carrera escalando poco a poco el monte improbable (como diría Dawkins) que supone la disminución local de orden que finalmente, con el tiempo, dará lugar al fenómeno complejo del segundo grupo. Es decir; que el fenómeno irá pues formándose gradualmente conforme aumenta su complejidad, al mismo tiempo que aumenta su eficiencia y consumo energético por unidad de área en mayor proporción.

Mediante la evolución, el Universo consigue dos cosas: por un lado, consigue como hemos visto, otro modo de consumir la energía útil global que éste contiene de un modo diferente a la mera disminución de orden (aumento de caos = ΔS >> 0), pero además, consigue un objetivo añadido: ¡que el consumo de esta energía útil sea enorme en comparación con los fenómenos caóticos del primer grupo!

Cuando el descenso de energía útil en el Universo se debe al aumento de entropía (desorden espontáneo) dicho consumo ocurre de un modo más o menos lineal (aproximadamente), sin embargo, cuando el gasto energético se debe a un fenómeno del segundo grupo (con alto orden local pero con una mucho mayor ferocidad consumidora de energía), se logra que el fenómeno "busque" la eficiencia en el consumo energético, y que además, llegados a cierto nivel de complejidad, incluso que se afane (volición) en consumir tanta energía como sea posible. En otras palabras: ¡los fenómenos del segundo grupo son capaces de consumir energía de un modo exponencial!

Una bacteria, como hemos visto, es capaz de generar por unidad de área una cantidad de calor superior proporcionalmente en varios órdenes de magnitud al de una estrella como el Sol. Los fenómenos complejos estables tienen todos esta capacidad para superar en mucho el consumo de los fenómenos espontáneos desordenados, ¡y además presentan tanto mayor eficiencia cuanto más complejo es el fenómeno!

Cualquier carrera evolutiva en un medio determinado se puede entender con estos principios: 1º) es siempre una carrera en pos del mayor consumo energético posible, 2º) dará como resultado siempre fenómenos complejos estables dentro de dicho medio, 3º) serán fenómenos tanto más estable cuanto mayor eficiencia presenten, y por último, 4º) los fenómenos dominantes (los más estables) consumirán energía en proporción a su complejidad: cuanto mayor complejidad presenten, mayor eficiencia en el consumo van a tener. Llegado el momento, el consumo del fenómeno en cuestión se hace exponencial en el tiempo (en los seres vivos, este paso ocurre con la replicación).

Resumiendo: La evolución natural en el Universo es un mecanismo espontáneo (tan espontáneo como el aumento del desorden), en el que, dadas ciertas condiciones ambientales (que difieren según el tipo de fenómeno), consigue disminuir la energía útil global del mundo de un modo alternativo al desorden, y además lo consigue con mucha mayor rapidez (exponencialmente). Se puede decir que la evolución es un mecanismo que permite crear máquinas naturales capaces de consumir la mayor cantidad de energía posible por unidad de tiempo.

Experimento que evidencia este comportamiento señalado.

A continuación vais a poder ver un claro experimento que, mediante una simulación computacional, nos muestra como el Universo posee de modo ontológico (en cuanto que se basa en leyes físicas esenciales que dictan lo que es y el modo en que algo puede ser) esta relación innata entre complejidad y eficiente consumo energético:

El experimento parte de un potencial Lennard-Jones (L-J), el cual es usado muy comúnmente en la simulación de la realidad por ordenador, debido a que muestra una buena aproximación a la física real de partículas y a que, aún siendo un modelo simple, permite un detallado estudio de las propiedades de los gases y de las interacciones en modelos moleculares.

Pues bien, la metodología y el resultado del experimento es el siguiente:

1) Comenzamos simulando un sistema L-J cerrado (sin energía entrando o saliendo del sistema), y sin bordes (unbounded). Dicho sistema espontáneamente (puesto que es una simulación relativamente fiel del mundo real) tiende SIEMPRE hacia el desorden y el caos (aumento de entropía ΔS > 0). No es posible ver emerger en este sistema cerrado ningún tipo de complejidad estable, puesto que no hay una fuente de energía externa que pueda mantener dicha estructura. Es decir; que cuando se simula por ordenador estos sistemas cerrados, no pueden aparecer más que el tipo de fenómenos clasificados en el primer grupo que hemos descrito más arriba. El siguiente sería un vídeo de ejemplo:



2) A continuación preparamos un sistema L-J abierto; es decir, un sistema donde exista una fuente de energía externa que fluya en nuestro sistema, y donde también haya una fuente térmica hacia la que disipar energía en forma de calor. Pues bien, en estas condiciones, además de patrones caóticos TAMBIÉN vemos aparecer patrones complejos en el sistema. De hecho, estos sistemas pueden evolucionar espontáneamente hasta mostrar fenómenos de los dos grupos antes descritos. Lo quiere decir por lo tanto, que un sistema abierto puede evolucionar hacia estados desordenados y caóticos como antes, pero que también puede hacerlo hacia sistemas que muestren estructuras y patrones complejos gracias a un consumo de energía varios órdenes de magnitud superior a la consumida en fenómenos caóticos. Se observa en estos sistemas además, que cuanto más complejo es el patrón mostrado en el potencial L-J, más energía externa se ha consumido y disipado en forma de calor. En otras palabras, se observa una estrecha relación entre consumo energético y grado de complejidad logrado. Veamos un vídeo de potencial L-J evolucionado espontáneamente hacia un estado comeplejo:


Para ver con más detalle aún esta relación "consumo energético-grado de complejidad", se repite de nuevo el experimento siguiendo dos metodologías distintas, y se compara el resultado: 

2.a) Creamos primero por ordenador cientos de miles de sistemas L-J abiertos aleatorios e independientes unos de otros, y posteriormente se seleccionan aquellos sistemas que presentan mayor complejidad estructural relativa, siendo los otros (los más caóticos) desechados. Continuamos este proceso varios minutos, y finalmente de los cientos de sistemas L-J que sobreviven a nuestra criba (al mostrar un patrón relativo bastante complejo), elegimos uno de ellos para estudiarlo. El resultado es el siguiente:


Se observa en el vídeo un claro patrón complejo en la distribución espacial de las partículas; patrón que en un sistema cerrado es imposible de detectar siguiendo estos mismos pasos. Además, si continuamos estudiando las propiedades de estos sistemas supervivientes, observamos que ¡cuanto más complejo es el patrón, más energía consume!

¡Y se puede ver también como este tipo de sistemas complejos son estables en el tiempo NO tendiendo hacia el caos de manera espontánea!

El siguiente vídeo muestra el patrón conseguido si se invierte más tiempo aún en seleccionar sistemas complejos. Se puede observar que cuanto más tiempo evoluciona el sistema, más fácil es encontrar sistemas que sigan patrones cada vez más complejos, con el consiguiente aumento en el consumo de energía:


2.b) Por último, vamos a repetir el experimento siguiendo el proceso inverso. Se van a crean por ordenador cientos de miles de sistemas L-J abiertos e independientes unos de otros, y posteriormente se seleccionan aquellos sistemas que presentan mayor consumo energético relativo, siendo los otros (los menos consumidores) desechados. 

¡Y de nuevo se observa la relación ente energía y complejidad! Porque en esta ocasión, es al seleccionar aquellos sistemas L-J que más energía externa consumen, cuando vemos que se corresponden siempre con sistemas que muestran patrones espaciales complejos. Por lo tanto, de estos dos métodos experimentales, concluimos que ya sea buscando complejidad, o buscando eficiencia de consumo, siempre se observa el mismo tipo de estado final para el sistema donde complejidad y eficiencia disipativa siempre aparecen igualmente relacionadas.

Veamos para terminar un vídeo que muestra uno estos sistemas supervivientes a la criba, que muestra el mayor consumo conseguido durante las pruebas (es realmente impresionante que algo así pueda aparecer de manera espontánea simulando nuestra realidad física con detalle):

 

Para más detalles sobre este asunto, podéis visitar este artículo donde lo explico todo con mayor profundidad [5].

La vida biológica.

Es en este punto cuando realmente estamos en condiciones de comprender qué es la vida biológica aquí en la Tierra. Resulta que no es ni más ni menos que un fenómeno natural y espontáneo, resultado de un lento y gradual proceso de ajuste entre complejidad y eficiencia energética durante millones de años: un fenómeno más de los muchos posibles dentro del segundo grupo que hemos estudiado antes, los cuales acontecen gracias al comportamiento esencial del mundo que favorece la prevalencia o estabilidad de aquellos fenómenos que más eficientemente consumen energía en un medio dado: es decir; aquellos que mayor complejidad presentan manteniendo a la vez negativa en el tiempo la energía libre de Gibbs.

De hecho, si quisiésemos esquematizar de un modo matemático qué es la vida biológica, no necesitaríamos escribir grandes obras, sino que nos valdría con los siguientes párrafos:

Podemos decir, sin mucho miedo a equivocarnos, que la vida es:

1) ΔS << 0 (un fenómeno que disminuye localmente en gran medida la entropía debido a su complejidad estructural y la presencia de patrones -en contra de la segunda ley de la termodinámica-)

2) ΔH << 0 (un fenómeno capaz de consumir gran cantidad de energía, y disipar con ello gran cantidad de calor, es decir; un fenómeno capaz de interactuar en gran medida con un medio externo)

3) ΔG << 0 (un fenómeno donde la capacidad para realizar trabajo y disipar calor mediante un consumo energético, supera en mucho el aumento local de orden que requiere; de modo que globalmente, la energía libre útil total siempre disminuye en el tiempo. Es decir; que la entropía global realmente aumenta bastante -en forma de calor- a pesar de la disminución local previamente requerida)

Es decir, que este punto 3) supone lo siguiente (ignoramos T, por claridad): ΔG << 0  y  ΔG = ΔH - ΔS << 0  => ΔH << ΔS.

Pero puesto que en los fenómenos del grupo 2 el orden siempre aumenta (punto 1), la entropía local del sistema en el tiempo va a ser siempre mucho menor que cero (ΔS << 0, incremento de entropía negativa), por lo que tenemos en este caso particular que hay que consumir obligatoriamente siempre mucha energía (decrementando la entalpía H), de manera que se mantenga la inecuación (ΔH << ΔS); puesto que si ΔS es negativo, ΔH deberá ser mucho más negativo, y eso precisamente se consigue realizando trabajo mecánico y disipando calor.

Dicho de otro modo, la energía consumida y disipada en forma de calor (incremento negativo de la entalpía) debe ser, en estos fenómenos, mucho mayor que el incremento de orden local para conseguir su estabilidad en el tiempo.

Es decir, que para lograr y conservar en el tiempo un fenómeno complejo como la vida, debe poder absorberse continuadamente de una fuente externa una gran cantidad de energía con la que se hará principalmente trabajo mecánico y se disipará calor a una fuente termal. En el caso de la vida en la Tierra, la fuente de energía es el Sol, y la fuente termal la atmósfera y el océano.

4) La improbabilidad de que aparezcan en el mundo fenómenos complejos y eficientes consumidores de manera fortuita (puesto que las leyes físicas determinan que en el Universo las configuraciones ordenadas son minoría frente a las posibles configuraciones caóticas), hacen que los fenómenos complejos como la vida deban ir gradualmente emergiendo conforme pequeños aumentos de orden local lleven aparejado por azar un consumo energético capaz de disminuir ΔG < 0. Además, cuanto más negativo haga ΔG << 0, más estable será ese nuevo fenómeno y más fácilmente servirá de base para futuros cambios aleatorios que disminuirán aún más ΔG.

Otros fenómenos complejos y su relación con el consumo energético.

Los cuatro puntos vistos anteriormente no sólo engloban y dirigen la aparición de la vida en la Tierra, sino que en realidad conforman la base físico-química que explicaría la aparición y evolución de todos y cada uno de los fenómenos complejos posibles en el Universo. Veamos cómo aplicamos esta afirmación con varios ejemplos que puedan esclarecer el asunto:

Ejemplo 1) La evolución por selección natural darwiniana es un caso típico donde todo lo dicho aplica. Tenemos varias especies de seres vivos compitiendo en un medio; lo cuales no son más que máquinas estables capaces de consumir tras millones de años mucha más energía que la cantidad de orden que su estructura supone. Pues bien, en esta situación, cada vez que se produce la reproducción de un individuo concreto pueden ocurrir pequeñas variaciones estructurales aleatorias (mutaciones), algunas de las cuales pueden mejorar por puro azar el consumo energético del fenómeno resultante (en este caso un nuevo individuo de una especie concreta). Si la mejora supone disminuir de un modo notable la energía útil global (ΔG), entonces ese cambio aleatorio será muy estable, permaneciendo en el tiempo e incluso desplazando a otras estructuras menos eficientes que compitan por la energía y los recursos del medio. Esto no es ni más ni menos que lo que Darwin denominó evolución por selección natural.

Ejemplo 2) Los huracanes. Un huracán es un fenómeno muy complejo (ΔS << 0), que ocurre cuando las condiciones climáticas son tales que permiten que una gran cantidad de energía útil se encuentre disponible para hacer trabajo mecánico. Todo el movimiento coordinado y el complejo patrón circular local, son tales que permiten absorber el máximo posible de energía del medio de modo que el trabajo mecánico generado consigue con creces consumir y disminuir la energía libre global (ΔG << 0). Este trabajo mecánico, por cierto, es el responsable de todo el daño que genera un huracán tras su paso.

Para que un huracán acontezca, es necesario pues que consuma mucha más energía que la cantidad de orden que su formación requiere, y para permanecer estable en el tiempo, requiere que dicha proporción se mantenga. Precisamente, cuando el huracán desaparece es cuando no es capaz de mantener esta relación "complejidad-consumo", fundamentalmente porque las condiciones climáticas dejan de permitir la absorción de la energía requerida conforme el huracán se desplaza por el planeta y alcanza tierra firme.

Si os fijáis bien, un huracán sigue un patrón bastante similar al que vimos antes en los vídeos con las simulaciones experimentales del potencial L-J.


Ejemplo 3) Un río. Los ríos son otras estructuras que presentan siempre aquellos patrones espaciales complejos que históricamente más corriente de agua siguieron, lo cual implica que aparecen gracias al eficiente trabajo mecánico ejercido por toda esa corriente pasada, la cual asegura que el orden que presentan actualmente consiga siempre un eficiente consumo en forma de trabajo por el movimiento se su agua.

Ejemplo 4) El hombre como especie dominante. Hemos visto que conforme la evolución acontece durante millones de años, lo normal es que pequeñas (a veces muy pequeñas) variaciones den lugar a mejores consumos energéticos en proporción a la complejidad de la variación (con tal de que el cambio consiga ΔG < 0 en la justa medida para ser estable y permanecer en el medio). Sin embargo, en ciertos momentos históricos, es posible que cierto aumento de orden local no sólo de lugar a un aumento relativamente pequeño de eficiencia estable, sino que, en raras ocasiones, por puro azar durante los eónes, un pequeño cambio estructural relativo puede dar lugar a un aumento exponencial en la capacidad de generar calor.

Estos saltos evolutivos se han registrado en varias ocasiones en la vida terrestre, siendo de destacar la aparición del Homo sapiens. Desde un primer momento, el aumento relativo de la capacidad craneal del hombre permitió a éste dominar el entorno de un modo nunca visto en la Tierra, siendo quizás el descubrimiento del fuego determinante. El hombre (en realidad su cerebro) es el fenómeno más complejo acontecido en el planeta, lo cual evidentemente debe llevar aparejado un aumento en la capacidad para obtener y utilizar energía extraordinario. Y ciertamente el ser humano es, de hecho, el ser vivo que más energía neta media consume por individuo; residiendo ahí la clave de nuestra dominación sobre el resto de especies vivas, y nuestra gran estabilidad como fenómeno en el mundo.

Hoy por hoy, nuestra especie es el fenómeno complejo conocido que mejor cumple en proporción a su tamaño el mandamiento físico de que ΔG << 0 (si realmente somos especiales en algo, es en este hecho). Es más, si colocamos en proporción de tamaño a una persona con una estrella, el hombre posee más densidad calorífica media que cientos de estrellas juntas.

Relación entre el aumento de la complejidad social y la revolución industrial.

Otro ejemplo de todo lo dicho hasta ahora, es el modo en que el ser humano se organiza en sociedad. Y es que el vivir en sociedad es también un fenómeno complejo, natural y espontáneo, y como tal, se debe ceñir al mandamiento de consistir en ser una estructura eficiente consumidora de energía. De hecho, conforme crece la complejidad en la estructura social del hombre, también el consumo requerido va creciendo progresivamente; pudiéndose decir de modo equivalente, que conforme aumenta el consumo energético medio de nuestra sociedad, ésta crece en complejidad al mismo tiempo: siendo fiel reflejo de esta situación el aumento exponencial de la población en los últimos siglos, y el crecimiento en el bienestar social alcanzado.

Y es sin duda importante señalar, en favor de esta teoría, el hecho de que se produjo un evidente salto en la complejidad social cuando se logró tecnológicamente acceso a nuevas fuentes de energía en el siglo XIX. Es indudable que la revolución industrial no fue otra cosa que un aumento exponencial en el modo en que se pudo acceder y consumir más energía gracias a nuevas fuentes energéticas tales como la combustión del carbón. Ocurriendo a principios del siglo XX un nuevo salto cuando se comenzó a explotar en masa el uso de combustibles fósiles más eficientes como el petroleo.

Toda esta nueva energía disponible permitió un mayor consumo neto por persona, y facilitó el aumento exponencial de la  población mundial y su complejidad interna (lo que se conoce como el bienestar social); lo que se tradujo en un enorme crecimiento en la producción y consumo global. Este dominio energético supuso la expansión y supremacía del modo de vida Occidental sobre el resto del mundo, y  es esta eficiencia de producción y consumo la que lo mantiene estable. Tan estable de hecho, que no habrá nada que pueda hacerle sombra siempre y cuando tengamos acceso a la suficiente energía como para mantener tanta complejidad. Esta es la razón de que todos los países se afanen tanto en aumentar su producción (lo que se conoce como el producto interior bruto); de ello depende la supervivencia de su bienestar.

Y viene al caso hacer notar en este punto, que precisamente el tan temido "Peak Oil" (momento en que la rentabilidad de extracción del petroleo y otros recursos fósiles decaiga y comiencen a escasear) será un momento clave en la historia de la humanidad puesto que, si no se consigue acceso a una nueva fuente de energía alternativa tanto o más eficiente que las fósiles (y las renovables no lo son), la complejidad social será imposible de mantener, y ocurrirá inevitablemente un retroceso en la misma (incluyendo reducción del tamaño de la población y del bienestar social). Si el descenso en la cantidad neta de energía externa no se consigue sobreponer, el "Peak Oil" [6] va a suponer sin duda nuestra vuelta al estilo social del siglo XIX (o incluso XVIII).

El aumento de la complejidad social y la aparición de máquinas inteligentes.

Pero, para poder seguir con nuestra argumentación, supongamos que conseguimos la tan necesaria fuente de energía alternativa a las fósiles (y de igual eficiencia): es decir; supongamos que conseguimos mantener la complejidad social de algún modo (incluso si ese modo es mediante controles mundiales de natalidad y un mayor desnivel social, donde unos pocos vivirán y mantendrán una complejidad social mucho mejor que la de mayoría, que harán las veces de mano de obra "barata").

Pues bien: Hemos visto que lo fundamental para la física del mundo es mantener siempre negativa la tendencia de la energía útil total disponible (ΔG < 0), y en eso se basan precisamente los fenómenos complejos estables como es el caso del hombre y su sociedad. Y esto supone, como ya hemos repetido, que si se desea un mayor aumento de complejidad social, se requiere siempre aumentar el consumo y la producción; y en este caso, esto significa que para aumentar el alcance de los bienes a una mayor población (disminuir la pobreza, mejorar el bienestar de más personas, etc.), vamos a requerir de mejores y mayores infraestructuras que permitan una comunicación eficiente de más y más recursos entre cada vez más y más personas, y esto sólo es posible, como no, a costa de aumentar el consumo energético neto medio por persona en el planeta. En otras palabras: hay que producir y consumir necesariamente cada vez más, para poder aumentar la complejidad social lo suficiente como para que cada vez más personas mejoren su bienestar.

Pero hay otro factor que entra en juego aquí, y no es ni más ni menos que las limitaciones fisiológicas del hombre para realizar trabajo mecánico. Por mucha energía de que se disponga, el hombre es capaz de trabajar un limitado número de horas al día, tiene una potencia muscular limitada, sufre de constantes enfermedades, de fatiga laboral, de problemas personales, etc., lo cual pone cota a su eficiencia para consumir energía con la que realizar trabajo. Y esta acotación en la capacidad de realizar trabajo de un modo eficiente sería un impedimento para un mayor crecimiento en la complejidad social...si no fuese por las máquinas.

De no ser por las máquinas, la tecnología que permitió acceso a nuevas fuentes de energía no habrían servido de nada. Una máquina bien construida (con su consiguiente orden local), permite utilizar estas fuentes fósiles de un modo extraordinario, con todo el trabajo mecánico neto que eso supone. Las máquinas industriales fueron las que permitieron el crecimiento social del siglo XIX y mediados del XX, y sin su uso, no habríamos pasado del modo de vida previo a la revolución industrial. Pero estas máquinas tradicionales, por si solas, también tienen una pega: requieren de la constante supervisión y manipulación por parte de un ser humano, con las mismas limitaciones que ya hemos mencionado: fatiga mental, bajas por enfermedades, bajas por problemas personales, limitado número de horas de trabajo supervisando, costes sociales del empleado, etc.

Por lo tanto, la necesidad de mejorar aún más la productividad, llevó desde finales del siglo XX a la gradual aparición de máquinas no supervisadas (o cada vez menos supervisadas). Este proceso no ha parado desde entonces, y ya existen fábricas a día de hoy (concretamente en Japón y China) que funcionan exclusivamente con robots "casi" independientes. De hecho, hace poco una noticia en los medios contaba cómo en cierta fábrica de China había despedido y sustituido a casi todos los trabajadores humanos por máquinas [7], y además empresas tan importantes como Amazon está actuando también en esta dirección.





Los peligros de la humanidad.

El ser humano posee una fuerte intuición o tendencia innata a sentirse siempre de algún modo muy especial como fenómeno del mundo, pero realmente, en esencia no lo es. Nuestra singularidad es una cuestión de escala y poco más, ya que, según hemos visto, simplemente somos un mero fenómeno complejo más de entre tantos posibles. Y si realmente somos especiales de algún modo aquí en la Tierra, es simplemente porque conformamos la estructura compleja actual más eficiente en el uso y consumo energético del planeta. Pero sin embargo, esto no fue siempre así, ni tiene porqué continuar siendo siempre así. Es muy probable que, más pronto que tarde (a escala geológica), alguna otra estructura supere nuestra eficiencia y nos desplace como especie dominante: estas cosas ya han ocurrido antes en infinidad de ocasiones en la historia evolutiva del mundo.

Sin embargo, el modo concreto en que pasaremos a la historia como especie dominante evidentemente es algo que no se puede conocer; aunque, como ya hicimos al inicio de este artículo, se pueden enumerar algunas alternativas plausibles: un meteorito, una gran erupción volcánica en cadena, un cambio climático extremo, una enfermedad muy infecciosa, una guerra nuclear a gran escala...y, como no, debido a la aparición de máquinas inteligentes.

A esta última posibilidad es a la que se refiere Stephen Hawking en el artículo mencionado en la entradilla [1], donde alerta, junto a otros mil científicos, de la posibilidad real de un futuro desastre debido a la robótica y la inteligencia artificial. Sin embargo, y por mucho que quieran alertar, este peligro es imposible de soslayar debido a la propia naturaleza del hombre, ya que la humanidad no puede evitar su tendencia a aumentar la producción y el consumo.

Esta carta me recuerda mucho a la que escribieron grandes científicos de principios y mediados del siglo XX en donde alertaban del peligro real de la tecnología nuclear para la supervivencia de la humanidad...dicha carta fue obviamente ignorada, y desde entonces vivimos con el miedo de una posible aniquilación mutua. Y es también algo similar a lo que ocurre actualmente con el modo en que se ignoran las alertas sobre el evidente cambio climático: sencillamente no podemos poner freno al uso indiscriminado de energía (como no pudimos frenar la proliferación nuclear), porque tal cosa llevaría aparejada una obligada disminución del orden social (recordemos la obligada relación "complejidad-consumo" que las leyes físicas determinan). Si se consume menos energía (o si se consume energía menos eficiente), lo padecerá la población mundial a causa de un retroceso obligado en la complejidad social (menos bienestar, menos servicios, mayor mortalidad, etc.) . Es decir; que el hombre realmente NO es libre para actuar de un modo tal que no conlleve un consumo energético a la altura de la complejidad social que pretende mantener.

Por lo tanto, y pese a todas las advertencias, seguiremos perjudicando el clima del planeta, seguiremos expandiendo el potencial nuclear, y arrasaremos sin dudarlo con toda la energía que caiga en nuestras manos. Huelga decir, que también pese a todas las advertencias de estos científicos, continuaremos investigando y mejorando en tecnología robótica y de inteligencia artificial. Nuestros actos sociales son consecuencia de nuestra esencia material, y pese a que se intente racionalizar, no podemos evitar esta conducta a gran escala, como no podemos evitar como individuos dejar de respirar y consumir alimentos, salvo pena de perder la complejidad estructural de nuestro cuerpo y morir (como hemos visto, tanto un individuo como una sociedad de individuos, conforman fenómenos complejos regidos por las mismas leyes ontológicas del Universo).

Gradual desplazamiento del hombre en favor de otras estructuras disipativas más eficientes.

Por lo tanto, vemos que es algo real y plausible el hecho de que en algún momento futuro el hombre sea desplazado de la hegemonía mundial debido a su propia tecnología. Es algo que se siente y sobre lo que se han escrito ya cientos de novelas de ciencia ficción al respecto, siendo; por cierto, los libros del magistral Isaac Asimov los más recomendables.

Y aunque se ha escrito ya mucho, como digo, sobre el asunto, voy a continuación a imaginar o especular mi propia versión de los hechos que podrían llevar al desplazamiento del ser humano como especie dominante en nuestro planeta debido a la tecnología:

Pues bien, yo creo que continuará durante décadas la investigación en tecnologías de la robótica y la IA, y creo que el avance en estos campos cosecharán cada vez un mayor éxito. De hecho, ya ha comenzado hoy día el gradual proceso por el que las máquinas son cada vez más y más autónomas y autosuficientes; y será este mismo proceso de mejora continua el que irá progresivamente disminuyendo la mano de obra humana en todos los ámbitos industriales y de servicios. Esto llevará a que cada vez haya menos trabajo remunerado para las personas, con el consecuente aumento de la clase baja (y la casi desaparición de la clase media). Sucederán como consecuencia grandes disturbios y revueltas contra la clase alta (la oligarquía), la cual se encargará de sofocar mediante el uso de una policía y un ejercito cada vez más robotizado. Con el tiempo, se intentará solucionar el problema imponiendo un estricto control de natalidad, con la idea de ajustar la población al trabajo y producción disponibles. Esto implicará una drástica disminución de la población mundial, y la desaparición gradual de la problemática clase baja. Finalmente sólo quedarán una pequeña población de clase alta y un enorme número de robots "esclavos" (situación similar a la ocurrida, por ejemplo; en el imperio Romano, aunque con esclavos robots y menos ciudadanos). Mientras tanto, con el tiempo, los robots cada vez deberán de ser mas autosuficientes para no requerirse de tanto soporte humano (debido a la creciente desproporción entre humanos y máquinas). Llegará el día en que las máquinas finalmente alcancen una autosuficiencia completa, lo cual implicará una capacidad de replicación autónoma de su propia estructura.  Este momento será determinante, puesto que las máquinas habrán llegado a constituir de facto un fenómeno complejo autorreplicante independiente, y además serán mucho más eficientes y estables que cualquier ser biológico. Serán por último las leyes físicas y el transcurso del tiempo los encargados de que finalmente sólo perduren máquinas no basadas en el carbono.

Por tanto, no es que a Stephen Hawking se le haya ido la cabeza, sino que realmente el miedo que nuestros científicos muestran ante el avance en la investigación sobre máquinas inteligentes está muy bien fundado. Y es que, de continuarse dichos estudios y mejoras tecnológicas, muy probablemente terminará apareciendo en el mundo un nuevo fenómeno complejo autónomo mucho más eficiente consumiendo energía que el propio hombre; y como hemos visto antes, las leyes de la física nos dice que, dado el caso, el fenómeno más eficiente siempre es más estable y desplaza al resto de su dominio. Y no es sólo que nos desplacen, sino que más tarde, alguna catástrofe natural (o artificial) fortuita podría hacernos desaparecer como especie, mientras que las máquinas autónomas podrían permanecer como fenómeno. Es decir; que por ejemplo una supuesta guerra nuclear, grandes erupciones volcánicas (junto a un enorme "invierno volcánico"), o un gran meteorito, podrían acabar con la vida biológica, pero podría no acabar con estos robots más estables y menos susceptibles a cambios climáticos, radiactivos y físicos en general [8].

El hombre como puente en la aparición de fenómenos más complejos.

Hace tiempo que se sabe en física que la aparición de los elementos más complejos no pudieron formarse espontáneamente tras el Big Bang, sino que tuvieron que esperar a que aconteciesen fenómenos más complejo en el Universo para suceder: en concreto, hubo que esperar a la aparición de las estrellas y a su explosión final en forma de supernovas para que todos los elementos de la tabla periódica llegasen a darse como fenómenos en el mundo [9].

Esto viene a ejemplarizar el hecho de que ciertos fenómenos naturales necesitan de otros previos que actúen como una especie de catalizador. Pues bien, bien podría ser el caso de que la vida biológica como nosotros la conocemos, llegue algún día a actuar de algún modo a través de nosotros (el ser vivo más complejo aparecido en la Tierra) como catalizador de estructuras mucho más complejas y estables que la que la propia biológica permite. Es decir; que podría ser el caso de que la vida biológica catalizara la aparición de otro tipo de fenómeno mucho más complejo y estable, pero que no tenga la oportunidad de acontecer de un modo fortuito e independiente en el Universo. Piénsalo, ¡realmente podríamos servir como catalizadores de una nueva especie de "vida" basada en compuestos no orgánicos (elementos que puedan superar las capacidades fisiológicas de los compuestos basados en el carbono y el agua)! ¿Se podría decir, incluso, que esa podría ser nuestra finalidad como fenómenos?

De ser este el caso, podrían precisamente ser estas máquinas inteligentes y autónomas que desarrollaremos en las próximas décadas y siglos, los productos "catalizados" por nuestra racionalidad siguiendo los dictados de la física del mundo. Dichas máquinas, como ya hemos comentado, serán más eficientes y estables que nosotros y soportarán mejor posibles desastres naturales (o artificiales) por venir; y serán además, sin lugar a dudas, el fenómeno que tendrá alguna posibilidad real de colonizar otros planetas, puesto que la idea de que sea el hombre el que lo haga es utópica dada nuestra fuerte dependencia al entorno químico y climático de la Tierra, y a lo extremadamente sensibles que somos a otras amenazas como las radiaciones y el paso del tiempo (ya que la vejez y nuestra mortalidad es un verdadero problema en largos viajes espaciales).

Y es que, si la teoría física que llevamos defendiendo desde el principio es cierta, será una certeza el hecho de que el futuro del planeta tarde o temprano dejará de ser biológico (basado en el carbono), y que serán otros fenómenos "catalizados" más estables los que dominarán finalmente en el planeta. Es más; es muy probable que estos mismos sucesos ocurran en muchos otros planetas a lo largo del Universo, y que sea una regla física la que dicte que toda la vida comience siendo siempre biológica debido a las propiedades fisico-químicas favorables de este compuesto (esto es algo que defiende, por ejemplo, Nick Lane), pero que finalmente se termine dando el salto a otros compuestos más eficientes consumiendo la energía útil del mundo.

Ten en cuenta que si algún día llegase algún tipo de vida alienígena "inteligente" a nuestro planeta, muy probablemente estará basada en compuestos no orgánicos (quizás la película Transformers no sea tan disparatada después de todo xDDD).

Un saludo a todos.

Referencias:

[1] Artículo donde se explica las propuesta de Stephen Hawking sobre la posibilidad de que la IA acabe con la raza humana  http://www.elmundo.es/ciencia/2015/07/28/55b77746268e3e526a8b4586.html
[2] Página web del profesor Nick Lane: http://www.nick-lane.net/
[3] Web del invesigador Addy Pross: http://www.bgu.ac.il/~pross/
[4] Página oficial del equipo de trabajo del físico del MIT Jeremy England: http://www.englandlab.com/
[5] Artículo donde se explica con más profundidad la relación ontológica entre complejidad y eficiencia en el consumo energético: http://quevidaesta2010.blogspot.com.es/2015/03/evidencia-favor-de-la-teoria-de-jeremy.html
[6] Aquí tenéis un fabuloso artículo donde se explica qué es y cuales serían las posibles consecuencias de un eventual "Peak Everything": http://crashoil.blogspot.com.es/2011/05/peak-oil-peak-copper-peak-iron-peak.html
[7] Hay muchas noticias actualmente que hablan de la sustitución de mano de obra humana por "trabajadores" robóticos, por ejemplo esta: https://actualidad.rt.com/actualidad/174186-fabrica-china-robots, y aquí: http://es.gizmodo.com/toyota-empieza-a-sustituir-robots-por-personas-en-sus-f-1560309023
[8] No podía faltar hacer referencia a la famosa novela de Isaac Asimov: Yo, robot (https://es.wikipedia.org/wiki/Yo,_robot)
[9] Para un resumen introductorio de la Nucleosíntesis de los elementos de la tabla periódica, podéis ir a: https://es.wikipedia.org/wiki/Nucleos%C3%ADntesis