sábado, 27 de noviembre de 2021

Descenso de Gradiente, Tasa de Aprendizaje y optimización del aprendizaje profundo

El objetivo del descenso de gradiente es minimizar la función de error ajustando poco a poco los parámetros de aprendizaje representados por los distintos pesos. El descenso de gradiente se lleva a cabo mediante el ajuste de los distintos pesos de la red neuronal hasta obtener una convergencia, es decir, un mínimo de errores. Este ajuste se hace mediante pasos cortos, usando un hiperparámetro denominado tasa de aprendizaje (learning rate). 

Descenso de gradiente

El descenso de gradiente se puede definir como las derivadas parciales para un conjunto de parámetros con respecto a sus entradas, es un método iterativo que podemos usar para encontrar los valores de los parámetros de una función que tiende a minimizar el costo. Las tasas de aprendizaje juegan un papel importante en la optimización de los modelos de aprendizaje profundo.

La ilustración inferior, muestra un diagrama conceptual del descenso de gradiente y sus técnicas asociadas, algunas de las cuales veremos a continuación.

 

Descenso de gradiente

Podemos usar la Tasa de Aprendizaje y otras técnicas de optimización para optimizar el aprendizaje en modelos de redes profundas (Deep learning). Cuando queremos optimizar una red neuronal profunda, necesitamos ajustar la red durante el proceso de aprendizaje (asignar los pesos correctos a las neuronas). No podemos utilizar métodos estadísticos o analíticos para calcular el peso de las redes neuronales. Tenemos que adoptar el enfoque de sintonizar, configurar u optimizar los hiperparámetros para lograr un rendimiento óptimo en los modelos de redes neuronales profundas.

Tasa de Aprendizaje

La Tasa de Aprendizaje es uno de esos hiperparámetros que podemos configurar y ajustar para optimizar el aprendizaje. Es posiblemente el hiperparámetro más importante. Representa la cantidad de pesos que terminamos actualizando al entrenar redes neuronales. La cantidad de actualizaciones de peso durante el proceso de entrenamiento de la red neuronal también se conoce como tamaño de paso o paso. La Tasa de Aprendizaje brinda la capacidad de controlar la velocidad a la que aprenden los modelos de redes neuronales. La regla general es que una gran tasa de aprendizaje permite que los modelos aprendan más rápido, pero a costa de llegar a un conjunto final subóptimo de pesos, y esto puede afectar el rendimiento de los modelos de redes neuronales.

Una tasa de aprendizaje menor, por otro lado, permite que el modelo aprenda un conjunto de pesos más óptimo o incluso globalmente óptimo. Pero al mismo tiempo, puede llevar mucho más tiempo entrenar los modelos de redes neuronales profundas. La forma en que ajustamos las tasas de aprendizaje juega un papel importante en el rendimiento de los modelos. Y se recomienda que ajustemos las tasas de aprendizaje correctamente para lograr niveles de rendimiento mejores u óptimos a partir de modelos de redes profundas o neuronales. Las tasas de aprendizaje son un tipo de hiperparámetro que juega un papel crucial en el aprendizaje de las redes neuronales.

El entrenamiento de redes neuronales sobre todo si son profundas, puede ser una tarea de optimización muy difícil y compleja, ya que generalmente usamos diferentes tipos de algoritmos para entrenar redes neuronales. Para lograr un mejor rendimiento, podemos ajustar las tasas de aprendizaje, y este aprendizaje tiende a cambiar el proceso de entrenamiento iterativo. Existen diferentes enfoques que podemos adoptar para configurar y administrar las tasas de aprendizaje. 

El primer enfoque, consiste en disminuir gradualmente la tasa de aprendizaje en función de las épocas. Y el segundo enfoque consiste en disminuir las tasas de aprendizaje utilizando grandes caídas puntuales en épocas específicas. Aparte de estos dos enfoques, podemos adaptar otras técnicas que incluyen un ajuste de tasa de aprendizaje basado en el tiempo y un ajuste de tasa de aprendizaje basado en la caída. El uso del algoritmo de descenso radiante estocástico para la optimización implica un concepto de caída de la tasa, y la caída de la tasa representa la caída de la tasa de aprendizaje basada en el tiempo donde la tasa de aprendizaje se reduce siempre que cambia el valor de la caída. El programa de tasas de aprendizaje basado en caídas, por otro lado, es un enfoque de uso frecuente que implica reducir las tasas de aprendizaje en momentos específicos durante la fase de formación.

La mayoría de las implementaciones de este enfoque implican un programador de tasas de aprendizaje, que proporciona una capacidad de programación para reducir las tasas de aprendizaje en diferentes épocas durante el proceso de capacitación.

Existen diferentes algoritmos de optimización que podemos utilizar para optimizar los modelos de aprendizaje profundo. Y algunos son el descenso de gradiente, el descenso de gradiente estocástico, la programación de la tasa de aprendizaje y el descenso del gradiente de la tasa de aprendizaje adaptativo. El estocástico es un proceso que está estrechamente relacionado con la probabilidad aleatoria.

Descenso de gradiente estocástico

Cuando trabajamos con descenso de gradiente estocástico, seleccionamos aleatoriamente ciertas muestras, en lugar de trabajar con todos los datos en cada iteración. Durante el proceso de entrenamiento, las muestras se barajan y seleccionan para realizar iteraciones, y se calcula el gradiente de la función de costo. Dado que trabajamos con una muestra seleccionada al azar, la ruta que sigue el algoritmo para alcanzar los mínimos es menos apropiada en comparación con la del algoritmo de descenso de gradiente. Pero dado que alcanzamos los mínimos con una cantidad de tiempo de entrenamiento significativamente más corta, generalmente no tiene ningún impacto en el proceso de optimización y entrenamiento.

Con el uso del ajuste de tasas de aprendizaje, el algoritmo ajusta dichas tasas de aprendizaje durante el proceso de capacitación en función de ajustes predeterminados. Dichos ajustes pueden basarse en el tiempo, en pasos o incluso en un mecanismo de disminución exponencial. Existen ciertos ajustes asociados con las tasas de ritmo de aprendizaje. Por ejemplo, los hiperparámetros deben definirse de antemano y las tasas de aprendizaje deben aplicarse a todas las actualizaciones de parámetros.

Para manejar los problemas asociados con la programación de la tasa de aprendizaje, podemos usar el tercer algoritmo de optimización que mencionamos anteriormente, que es el descenso adaptativo de gradiente de velocidad de aprendizaje.

Descenso adaptativo de gradiente de velocidad de aprendizaje

Los algoritmos adaptativos proporcionan un enfoque automatizado de los parámetros de ajuste para las tasas de aprendizaje, y no necesitamos un ajuste manual en estos algoritmos. Hay varios algoritmos de descenso de gradiente de velocidad de aprendizaje adaptativo que podemos implementar, e incluyen Adagrad, Adadelta, RMSProp y Adam. 

 

Descenso adaptativo de gradiente de velocidad de aprendizaje


¿cuáles son los principales métodos de tasa de aprendizaje adaptativo que podemos adoptar o implementar?  Incluyen, RMSProp, AdaGrad, Adam, Adadelta y Adamax. 

RMSProp   

Video explicativo aquí

Es un algoritmo de optimización para redes neuronales. El objetivo principal de RMSProp es restringir la oscilación en dirección vertical, convirtiéndolo en uno de los algoritmos más populares que se ocupa de manera eficiente de la disminución de las tasas de aprendizaje. RMSProp se usa o implementa con frecuencia con redes neuronales recurrentes. 

AdaGrad   

Es un optimizador que involucra tasas de aprendizaje específicas de parámetros, y las tasas de aprendizaje se adaptan en función de la frecuencia con la que se actualiza un parámetro durante el proceso de capacitación. Cuanto más actualizamos un parámetro, menor es la tasa de aprendizaje.

Adam  

Es un algoritmo de optimización que podemos utilizar en lugar del descenso de gradiente estocástico clásico para actualizar los pesos de la red de forma interactiva en función de los datos de entrenamiento. El optimizador de Adam es sencillo de implementar. Es computacionalmente eficiente y requiere muy poca memoria. 

Adadelta

Es esencialmente una extensión de Adagrad, que busca reducir las tasas de aprendizaje agresivas y monótonamente decrecientes en Adagrad. En lugar de acumular todos los gradientes cuadrados pasados, Adadelta restringe la ventana de gradientes pasados acumulados a un cierto tamaño fijo.

AdaMax

Es una variante de Adam, que se basa en la norma del infinito. En AdaMax, el factor de peso en Adam actualiza las reglas y escala el gradiente de manera inversamente proporcional a la norma de regularización L2 de los gradientes pasados. Entonces, dependiendo de nuestros requisitos de automatización, podemos seleccionar el algoritmo o método correcto de entre las opciones mencionadas anteriormente e implementarlas al mismo tiempo. También observamos que la mayoría de los marcos de aprendizaje profundo proporcionan paquetes integrados 


viernes, 26 de noviembre de 2021

Activar Telnet en Windows 10

Es muy sencillo, vamos al icono de la lupa al lado del icono de windows y escribimos Activar, nos salen varias opciones, de las cuales elegimos Activar o desactivar características de Windows

                                     

Nos sale una lista, de la cual marcamos la opción Cliente Telnet y aceptamos. 




sábado, 20 de noviembre de 2021

Crear un diagrama de relación entre entidades

En esta demostración, veremos una herramienta que nos ayudará a crear un diagrama de relación de entidades, o ERD, para planificar la estructura de la base de datos. La herramienta se encuentra en el enlace https://www.visual-paradigm.com en un navegador, vamos a este sitio web donde hacemos clic en el enlace Download para descargar una prueba gratuita de 30 días. Entramos en la interfaz de Visual Paradigm, donde las pestañas de la parte superior identifican diferentes categorías de diagramas que podríamos querer crear con esta herramienta. Por ejemplo, ERD, que son diagramas de relación de entidades. Aunque si nos desplazamos hacia abajo, también tenemos otras opciones disponibles enumeradas a la derecha.  Hacemos  clic en la opción ERD. Aparece una nueva ventana con el encabezado Diagrama de relaciones entre entidades. 



Crear un diagrama de relación entre entidades
Tiene las siguientes opciones: En blanco, Álbum de fotos en línea, Alquiler de películas, etc. En la parte inferior están los botones, Next y Cancel. Podemos construir un diagrama de relación de entidades en blanco, o elegir una de las plantillas preexistentes, por ejemplo, si nos desplazamos hacia abajo, podemos elegir Bookstore Online. Podemos utilizar esta plantilla porque solo deseamos modificarla, y eso puede ser más rápido que construirla desde cero. La seleccionamos y hacemos clic en Siguiente. Le ponemos un nombre, y aceptamos. hacemos clic en el botón Next. Se abre el diagrama de tablas de la librería en línea. 

Crear un diagrama de relación entre entidades


Tiene las siguientes opciones en el panel de navegación: Cursor, Stored Procedures (Procedimientos almacenados), Triggers (Disparadores), etc. En el centro hay un diagrama de flujo de varias entidades como: Author, Book, Publisher, etc. Book está conectado al  Publisher,  Author, ShoppingBasket_Book y Warehouse_Book. Warehouse_Book está conectado a Warehouse. ShoppingBasket_Book está conectado a ShoppingBasket y ShoppingBasket está conectado al Customer. Podemos ver las diversas entidades. Esto sirve para diseñar la estructura de una base de datos, donde cada una de estas entidades, como las llamamos, representan una tabla de base de datos. Y dentro de cada una de ella, tenemos varias columnas. En el ejemplo de Publisher aquí, la tabla Publisher, tiene una columna Name que se define como  Primary Key (clave principal). Podemos verlo porque tiene una llave dorada. 


Crear un diagrama de relación entre entidades : Primary Key
Todo lo que debemos hacer para configurarlo es hacer clic derecho sobre el campo y luego incluir el campo en la clave principal. 

En el diagrama tenemos varias entidades o tablas. Esto define una estructura de base de datos. Por ejemplo, en la tabla Publisher, tiene una serie de columnas como Name, Adress, Telephone, URL.  Podemos realizar cambios en cualquiera de estos elementos. Por ejemplo, si hacemos doble clic en el nombre de una tabla en la parte superior, la selecciona y podemos escribir un nombre nuevo. 

Crear un diagrama de relación entre entidades: Modificar una tabla

Crear un diagrama de relación entre entidades: Modificar un campo


Lo mismo ocurre con una columna. Podemos cambiar lo que queramos. Por ejemplo, podría hacer clic con el botón derecho y escribir un nombre que deseemos. Cuando hacemos clic con el botón derecho en una columna, si elegimos Open Specification podemos determinar el tipo de datos de la lista desplegable Type. 

También podemos agregar nuevos elementos. Y también si estamos construyendo un diagrama de relación de entidades desde cero, podemos hacer clic con el botón derecho y hacer todo manualmente. Si hacemos clic derecho sobre una parte vacía del diagrama, y elegimos add Shape y luego Entity. De modo que se crea una nueva entidad (futura tabla de una base de datos)  

Crear un diagrama de relación entre entidades: Añadir nueva tabla


Una vez creada la tabla podemos definir columnas las columnas, si hacemos clic derecho dentro de esa tabla, podemos elegir New Column. 

Crear un diagrama de relación entre entidades: Nueva columna

Si hacemos clic derecho sobre la columna y elegimos Open Specification sale una lista desplegable donde podemos elegir por ejemplo el tipo de datos de la columna. 

Crear un diagrama de relación entre entidades: Nueva columna

Crear un diagrama de relación entre entidades: Incluir primary key

Crear un diagrama de relación entre entidades: Primary Key

También podemos hacer clic derecho sobre él y configurarlo como clave principal. 

Incluso tenemos la opción, de vincular estas columnas para establecer una relación. Por ejemplo, si colocamos el cursor sobre una tabla existente como Publisher. 

Crear un diagrama de relación entre entidades: Relaciones entre tablas


Contiene un icono que podemos usarlo para arrastrar una línea a la otra tabla. Y determinar si existe una relación de uno a uno con las filas de cada una de esas tablas, o de uno a muchos. Digamos que es uno a muchos.  Aparece una ventana emergente con 4 opciones de iconos de vinculación como: Relación uno a uno, Relación uno a muchos, etc. Hacemos clic en el icono que nos interese (en este caso Relación uno a muchos) y  aparece una ventana de especificación de relación. 

Crear un diagrama de relación entre entidades: Relaciones entre tablas


Tiene dos pestañas: Foreign Key Column Mapping (Asignación de columna de clave externa)  y General, donde se selecciona Asignación de columna de clave externa. Ahora, determinamos las columnas específicas que queremos vincular. Debajo en el combo se nos muestra la lista de columnas que podemos vincular con la clave principal en la tabla de Publisher, y podemos determinar a qué columna queremos  vincular nuestra tabla.

Podemos continuar con esto en el diseño de la estructura para nuestro almacenamiento de datos, y esto es parte de la arquitectura de datos. Hay muchas otras herramientas que hacen esto además de Visual Paradigm.

Si vamos al menú Herramientas en la parte superior y luego elegimos DB para base de datos. Y luego elegimos Configuración de la base de datos, podemos decirle que queremos hacer una conexión a un tipo específico de base de datos.

Crear un diagrama de relación entre entidades: Elegir base de datos

Crear un diagrama de relación entre entidades: Elegir base de datos


Hacemos clic en la opción Configuración de base de datos. Y sale un menú desplegable con el lenguaje de programación, en este caso está seleccionado Java y aparece una ventana que muestra: la Versión, el Driver, User, Engine, etc. y los botones de  Importar, (Import)  Exportar /Export), en la parte inferior.

Digamos que elegimos .NET como idioma, y Microsoft SQL Server. Podemos especificar el nombre del host. Así que la identidad de ese servidor a través de la red con un nombre de usuario y contraseña y prueba la conexión. 

Crear un diagrama de relación entre entidades: Probar la conexión

A la derecha está la Configuración de la base de datos con varias opciones. Nombre de la base de datos, nombre de usuario y contraseña. Justo debajo, hay un botón llamado Probar conexión. (test Connection) Nos encontraremos con muchas de estas herramientas no solo nos permitirán diagramar la relación entre nuestras entidades, las tablas de nuestra base de datos. En realidad, crearemos un sistema de base de datos dado, ya sea MySQL, Microsoft SQL Server, Oracle, DB2, etc. Por lo tanto, es importante tener una herramienta para realizar varios tipos de planificación de la arquitectura de datos en la empresa. 


sábado, 13 de noviembre de 2021

Construyendo redes neuronales

Vamos a construir una red neuronal usando Python y Keras para clasificación con TensorFlow como backend. Keras es una biblioteca de Python poderosa y simplificada que podemos usar para construir redes neuronales y redes de aprendizaje profundo.

La primera tarea es importar todas las bibliotecas necesarias para TensorFlow y Keras. En la primera celda de código, especificamos las declaraciones para importar todas las bibliotecas necesarias para crear un entorno de TensorFlow.

from __future__ import absolute_import, division, print_function, unicode_literals

# TensorFlow y Keras

import tensorflow as tf

from tensorflow import keras

También necesitaremos algunas bibliotecas auxiliares. Importamos numpy  y matplotlib. La tarea final consiste en imprimir la versión de TensorFlow para la que hemos especificado la versión de impresión en la última línea de la celda de código.

#librerías de ayuda

import numpy as np

import matplotlib.pyplot as plt

print(tf.__version__)

Al ejecutar esta celda, la última línea nos devuelve la versión de TensorFlow que tenemos instalada

La siguiente tarea será cargar los datos para construir el modelo de red neuronal. Keras proporciona varios conjuntos de datos que podemos utilizar para construir un modelo de red neuronal. Utilizaremos un conjunto de datos llamado fashion_mnist, que contiene varias imágenes que se pueden clasificar en diferentes tipos.

dataset_mnist = keras.datasets.fashion_mnist

(train_images, train_labels), (test_images, test_labels) = dataset_mnist.load_data()

Para acceder al conjunto de datos fashion_mnist, declaramos una variable en la primera línea llamada dataset_mnist y le asignamos keras.datasets.fashion_mnist para cargar los datos en dicha variable. Los datos que estamos cargando ya están etiquetados, para el conjunto de entrenamiento, contamos con train_images y train_labels.

Y para el conjunto de prueba, se proporcionan test_images y test_labels. Para generar estos dos conjuntos diferentes de datos de prueba y de entrenamiento, llamamos a la función load_data. 

 

Construyendo redes neuronales

La siguiente tarea consiste en definir varios tipos de clases. Hay varios tipos de clases que se pueden encontrar en el conjunto de datos fashion_mnist.

class_types = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat', 'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']

Hay diez etiquetas diferentes que se almacenarán en una matriz NumPy donde la primera etiqueta es asignada al número 0 y los números apuntarán a clases particulares. Por ejemplo, la etiqueta de la camiseta / top, 'T-shirt/top' será 0. La etiqueta para los pantalones 'Trouser' será 1 y así sucesivamente.

Al ejecutar la celda, se han definen los class_types. A continuación exploraremos los datos y el formato de los datos que usaremos para entrenar la red neuronal nuestro conjunto de entrenamiento.

train_images.shape

Si ejecutamos esta instrucción,  nos muestra el número de imágenes y la forma de estas. Indica que hay 60.000 imágenes y el tamaño de cada imagen es de 28 por 28 píxeles. 

len(train_labels)

Cuando ejecutamos la instrucción len(train_labels), la salida indica que hay 60.000 etiquetas en el conjunto de entrenamiento actual. Exploraremos las etiquetas en el conjunto de entrenamiento, que debería ser un número entero dentro de un rango particular. 

train_labels

Al ejecutar esta línea, se muestra el siguiente resultado: 

array([9, 0, 0, ..., 3, 0, 5], dtype = uint8

Esta matriz representa las etiquetas que están dentro del rango de 0 y 9. 

Para ver el número de imágenes y su dimensión en el conjunto de datos de prueba, ejecutaremos.

test_images.shape

Después de la ejecución, se muestra el siguiente resultado: (10000, 28, 28). Que indica que hay 10.000 imágenes y el tamaño de cada imagen es de 28 por 28 píxeles. 

Ahora vamos a preprocesar los datos de las imágenes. Para ello utilizaremos  plt, que es un objeto de Matplotlib que importamos anteriormente.

plt.figure()

plt.imshow(train_images[0])

plt.colorbar()

plt.grid(False)

plt.show()

Queremos inspeccionar la primera imagen y, para ello, hemos especificado las declaraciones plt.figure y plt.imshow. A la que le estamos pasando el índice 0 para obtener la primera imagen del conjunto de entrenamiento. 

 

Red neuronal con MNIST

Tras la ejecución, se nos proporciona la primera imagen, pero no se escala correctamente. Así que la siguiente tarea consistirá en escalar la imagen. 

train_images = train_images /  255

test_images = test_images /  255

Hacemos lo mismo con test_images, para asegurarnos de que estamos escalando correctamente el valor de las imágenes de entrenamiento y las imágenes de prueba antes de que se envíen a la red neuronal. Las imágenes de entrenamiento de prueba se factorizarán en 255. 

Ahora verificamos los datos, para ello, trazamos ciertos rangos de los datos, y usamos un tamaño de figura de 10 por 10.  Y especificamos xticks e yticks, que representan el eje x y eje y.

plt.figure(figsize=(10,10))

for i in range(25):

    plt.subplot(5,5,i+1)

    plt.xticks([ ])

    plt.yticks([ ])

    plt.grid(False)

    plt.imshow(train_images[i], cmap=plt.cm.binary)

    plt.xlabel(class_types[train_labels[i]])

    plt.show()

La declaración plt.imshow mostrará las imágenes. Después de extraerlas de  train_images, la instrucción que tiene justo debajo garantiza que las imágenes estén etiquetadas con los tipos de clase adecuados.

 

Redes neuronales con Keras

Podemos observar que cada una de las imágenes están etiquetadas con sus respectivos tipos de clases. Habiendo explorado los datos, la siguiente tarea es construir el modelo de red neuronal. Para construir el modelo, primero configuraremos la etiqueta del modelo y luego compilaremos el modelo.

model = keras.Sequential([

     keras.layers.Flatten(input_shape=(28, 28)),

     keras.layers.Dense(128, activation=tf.nn.relu),

     keras.layers.Dense(10, activation=tf.nn.softmax)

 ])

Hemos especificado el modelo utilizando la declaración model = keras.Sequential.  Y hemos agregado tres capas diferentes, la primera capa es la capa de entrada. La segunda capa es la capa oculta y la tercera capa es la capa de salida.

En la capa de entrada, estamos usando la función Aplanar (Flatten), a la que le estamos pasando el tamaño de entrada como 28 por 28, que es el tamaño real de la imagen. En la capa oculta, estamos usando la función Dense, a la que le estamos pasando un 128 como el número de nodos o neuronas, seguido de la función de activación relu. Finalmente, en la capa de salida estamos usando la función Dense y estamos pasando el valor del nodo como 10 seguido de la función de activación softmax. 

La tarea final es compilar el modelo. Tenemos que compilar y configurar el modelo con ciertas configuraciones importantes antes de que el modelo esté listo para entrenarlo. 

model.compile(optimizer='adam',

    loss='sparse_categorical_crossentropy',

    metrics=['accuracy'])

La primera parte contiene el optimizador, que indica cómo se actualiza el modelo en función de los datos proporcionados y la función de pérdida aplicada. La función de pérdida es la medida de precisión que generalmente está involucrada durante el proceso de entrenamiento.

La función de pérdida que hemos especificado es sparse_categorical_crossentropy. Las métricas, son el elemento de configuración final, se utilizan para especificar el aspecto de monitoreo de los pasos o procesos de capacitación y prueba. La métrica que hemos especificado es la precisión:  accuracy.  

Hemos construido y compilado nuestro modelo con éxito, y podemos comenzar a usar la red neuronal para entrenar. Hay una última línea que entrena el modelo.

model.fit(train_images, train_labels, epochs = 5)

 

Redes neuronales Keras con Python


sábado, 6 de noviembre de 2021

SQL frente a NoSQL

No se puede hablar sobre arquitectura de datos sin estudiar el almacenamiento de datos, ya sean archivos almacenados en el sistema de archivos o elementos almacenados dentro de una tabla de base de datos. Un sistema de base de datos compatible con SQL o lenguaje de consulta estructurado es un sistema de base de datos relacional. Incluye productos como Oracle SQL, Microsoft SQL Server o MySQL. Estos productos se pueden implementar en las instalaciones, pero también podemos implementarlos en una nube pública, donde no tenemos que preocuparnos por el hardware, el almacenamiento o la adquisición del software. 

SQL frente a NoSQL

SQL 

En un sistema de base de datos relacional, la razón por la que se llama relacional es porque podemos relacionar o vincular tablas. lo hacemos usando lo que se llaman claves externas. Por ejemplo, si tenemos una tabla Cliente y Transacciones, donde almacenamos información del cliente y almacenamos, digamos, artículos comprados, respectivamente. Para mantener un vínculo entre esas dos tablas separadas, lo que podemos hacer es usar una columna en ambas. Cada una de ellas tendría una columna de identificación de cliente única. Para que podamos establecer una relación entre los clientes y sus transacciones. Con un tipo de base de datos SQL, cada tabla, fila o registro almacena el mismo tipo de datos, como el nombre del cliente, número de teléfono, dirección de correo electrónico, dirección postal, etc.  Eso sería igual para cada fila o para cada cliente. Esto se llama esquema estructurado, donde el esquema es simplemente el plano que definimos, qué se almacenará y cómo se almacenará en el entorno de base de datos compatible con SQL. 

Las bases de datos SQL normalmente aprovechan el escalado vertical. Es decir, si necesitamos aumentar la potencia en la máquina donde está alojada la base de datos,  ya sea una máquina física o virtual, aumentamos la cantidad de RAM cuando escalamos,  o aumentamos la cantidad de CPU o el tipo de CPU a algo más rápido. O bien aumentando las IOPS del disco, (operaciones de entradas y salidas por segundo), lo que aumenta el rendimiento del disco. Estamos ampliando la escala. Reducir la escala significa que está disminuyendo la cantidad de potencia, tal vez reduciendo la cantidad de RAM o reduciendo la cantidad de núcleos de CPU disponibles para fines informáticos. 

NoSQL

NoSQL está diseñado para escalabilidad a gran escala. Por tanto, está diseñado para procesar macrodatos (Big Data). Ejemplos de productos que son NoSQL son MongoDB, IBM Domino, Redis, etc. A diferencia de una base de datos SQL, En NoSQL cada fila o registro de datos puede almacenar tipos de datos completamente diferentes. NoSQL utiliza un esquema semi o no estructurado. A diferencia de las bases de datos compatibles con SQL que usan un esquema o plano rígido o fijo de lo que se va a almacenar, ese no es el caso con NoSQL. Por eso escala tan bien. Podemos almacenar métricas de dispositivos de IoT, publicaciones en redes sociales, archivos de audio y video. Todas esas cosas se almacenan de manera muy diferente, tienen diferentes tipos de formatos, pero eso es exactamente para lo que está diseñado NoSQL. Y así, En este caso la  escalabilidad, se denomina horizontal.

Que es el escalado se utiliza más a menudo con NoSQL. Escalado horizontal significa que estamos agregando múltiples nodos de cómputo para manejar la carga de trabajo para un mejor rendimiento o para el procesamiento en paralelo de grandes conjuntos de datos.  Puede implementarse mediante la agrupación en clústeres, donde tenemos un montón de máquinas trabajando juntas para ofrecer el mismo servicio. O mediante el equilibrio de carga, de modo que si un servidor deja de funcionar, los usuarios son dirigidos a otro servidor que permanece en ejecución. Todos los servidores siempre ejecutan lo mismo al mismo tiempo. También podríamos utilizar la replicación en varios servidores para poder tener varias copias para la disponibilidad de datos.