Revelando o fascinante mundo das redes neurais ( inteligência artificial ) através de uma jornada pela mente humana

Christian Zambra
productmanagerslife
11 min readMay 21, 2023

Introdução

Embarque em uma jornada cativante, inspirada pela curiosidade de uma humana, explorando os domínios do aprendizado e das redes neurais. A partir dos neurônios humanos, compreenda um pouco da sua capacidade notável, e da intricada rede de conexões existente no cérebro, conhecida como sinapses, que permitem o aprendizado e a compreensão. Em seguida, rumaremos para o reino digital das redes neurais, onde neurônios artificiais imitam os humanos, permitindo assim que máquinas desvendem a arte do conhecimento e do aprendizado de padrões. E por fim, partiremos para o reino da aplicação, criando uma rede neural em Python e utilizando a biblioteca TensorFlow, exemplificando como a inteligência artificial pode imitar o aprendizado humano. Esta exploração destaca a dança harmoniosa entre a engenhosidade humana e os avanços tecnológicos, revelando o poder inspirador das redes neurais em moldar nossa compreensão do mundo.

Ilustração por Christian Zambra, usando a ferramenta Leonardo.Ai

Como nós aprendemos?

Neste início de jornada, vamos descobrir as maravilhas do aprendizado acompanhando a nossa curiosidade.

Imagine que você vive em um dado lugar, e todos os dias, aguarda pela chegada de uma pessoa querida. Seja a companheira que volta do trabalho, o pai pescador que volta do mar, a mãe executiva que vai ao escritório, ou a irmã que trabalha e estuda.

No início, essa chegada é sempre uma incógnita. Porém, com o passar do tempo, você começa a identificar padrões. No começo da semana, a pessoa querida demora mais a chegar. E com o passar da semana, quarta, quinta, chega mais cedo. Mas às Sextas Feiras a alegria é maior, pois a pessoa chega muito cedo, pouco depois do almoço.

Passa mais tempo e a você encontra mais um padrão. Nos dias de chuva a pessoa demora mais pra chegar que nos dias de sol.

E partindo desse aprendizado que faz seu coração bater mais forte a cada encontro e traz alegrias imensas, a você aprende padrões.

As maravilhas das conexões neurais

No centro do seu processo de aprendizagem está a intrincada rede de conexões dentro de seu cérebro, formada por neurônios extraordinários. Essas conexões, conhecidas como sinapses, desempenham um papel fundamental na transmissão e modulação de sinais entre os neurônios. À medida que você se familiariza com a regularidade do horário de chegada da pessoa em diferentes dias da semana, sinapses específicas se fortalecem ou enfraquecem com base nas informações de tempo recebidas. Esse fenômeno notável, conhecido como plasticidade sináptica, capacita os seus neurônios a adaptar dinamicamente suas forças de conexão, codificando o conhecimento da chegada da pessoa na sexta-feira.

A Arte da Adaptação Neural e Reconhecimento de Padrões

Continuando sua jornada, o seu cérebro abraça o poder da adaptação e do contexto. Como um artista que refina sua obra-prima, seus neurônios formam caminhos intrincados que reconhecem os padrões únicos associados à chegada antecipada da pessoa querida às sextas-feiras. Por meio desse processo, seus circuitos neurais tornam-se afinados, aptos a processar as características específicas que distinguem as sextas-feiras dos outros dias da semana. Essa capacidade aumentada de reconhecimento de padrões permite que você (por vezes sem se dar conta), faça previsões precisas sobre a chegada antecipada daquela pessoa querida que faz seu coração palpitar.

Um resumo sobre o aprendizado

A repetição de idas e vindas, chegadas e partidas, cria a memória. Cada vez que seu coração bate mais forte prevendo a chegada da pessoa querida, e sendo bem sucedida ou não nessa previsão, refina essa mente maravilhosa, reforça conexões que se transformarão em memória e aprendizado, e possibilitarão previsões. Assim nós humanos aprendemos, e como veremos a seguir, assim as máquinas também aprendem.

Ilustração por Christian Zambra, usando a ferramenta Leonardo.Ai

Como as Redes Neurais aprendem?

Imagine um reino digital onde redes inteligentes de neurônios processam informações, semelhantes às suas contrapartes humanas. Neste capítulo, mergulhamos no fascinante mundo das redes neurais, que imitam as funções dos neurônios humanos no reconhecimento e aprendizado de padrões. Ao entender o funcionamento interno dessas redes neurais digitais, obtemos insights sobre sua capacidade de reconhecer e lembrar padrões, assim como o cérebro humano. Vamos embarcar em uma exploração cativante das semelhanças e distinções entre os neurônios humanos e suas contrapartes digitais, revelando o poder inspirador das redes neurais.

A arte dos neurônios digitais

No mundo encantador das redes neurais, os neurônios digitais atuam como mensageiros astutos, comunicando-se por meio de sinapses com seus equivalentes. Enquanto os neurônios humanos se destacam em reconhecer padrões no reino físico, suas contrapartes digitais processam informações em uma paisagem puramente digital. Semelhante aos neurônios humanos, os neurônios da rede neural recebem entradas, como dados numéricos ou imagens, e os transmitem por meio de suas conexões, semelhantes aos sinais recebidos pelos neurônios humanos das sinapses.

A Dança da Aprendizagem em Redes Neurais:

No reino das redes neurais, aprender é uma arte que se desenvolve por meio de um processo conhecido como treinamento. Durante o treinamento, as redes neurais ajustam os pesos entre seus neurônios com base nos padrões que encontram nos dados de entrada. Esse processo de ajuste reflete o fortalecimento das conexões dentro dos neurônios humanos por meio de exposição e prática repetidas. À medida que as redes neurais treinam em um número crescente de exemplos, seus pesos se tornam mais refinados, permitindo que reconheçam padrões com maior precisão e façam previsões ou classificações informadas com base em seus padrões aprendidos.

A busca pela adaptação:

Semelhante à capacidade de aprendizado do cérebro humano, as redes neurais possuem a capacidade de formar novas conexões para aprender novos padrões. Essa adaptabilidade inerente permite que as redes neurais melhorem seu desempenho quando confrontadas com dados desconhecidos. Assim como o cérebro humano forja novos caminhos para entender novos conceitos, as redes neurais abraçam o desafio de processar novos padrões, expandindo ainda mais suas capacidades de reconhecimento de padrões.

Ao concluir nossa exploração das redes neurais, refletimos sobre a impressionante semelhança que elas têm com o cérebro humano. Enquanto os neurônios humanos e os neurônios digitais compartilham a capacidade de reconhecer e lembrar padrões, a natureza digital das redes neurais lhes permite processar grandes quantidades de dados com eficiência incomparável. Assim, a inovação hoje celebra a harmonia entre a engenhosidade humana e a inovação tecnológica, pois as redes neurais desvendam os segredos do reconhecimento de padrões e abrem portas para novas possibilidades. Que possamos continuar a abraçar o poder das redes neurais, sempre avançando em nossa compreensão do mundo e nos impulsionando para um futuro enriquecido pelas maravilhas do aprendizado neural. E para finalizar nossa jornada caro leitor, te convido agora a fazer parte dessa celebração, construindo uma rede neural em Python.

Um exemplo real, em Python, utilizando Jupyter e TensorFlow.

No fim de nossa viagem, embarcamos em uma jornada ao mundo real, no reino das redes neurais, movidos pela sua curiosidade real de aprender sobre redes neurais, e hipotética, trazida no nosso exemplo, de aprender (mesmo que sem saber ou se dar conta disso) quando aquela pessoa querida vai chegar. Inspirando-se nessa busca, exploramos um exemplo prático de uma rede neural em ação. Ao analisar um conjunto de dados que reflete o impacto dos dias da semana e do clima nos horários de chegada, desvendamos as notáveis capacidades preditivas das redes neurais.

Tudo começa com dados
Assim como na sua jornada hipotética que se inicia observando os horários de chegada daquela pessoa querida, nossa jornada começa com a criação de um conjunto de dados de amostra que captura os padrões temporais dos tempos de chegada. Atribuímos diferentes horários de chegada com base nos dias da semana, observando uma tendência decrescente de segunda a quinta-feira, seguida de uma redução significativa nas sextas-feiras. Além disso, introduzimos a influência do clima, com os tempos de chegada aumentando em 30% se chover. Por meio desse conjunto de dados, pretendemos espelhar as observações que você poderia ter feito, fornecendo uma base para a proeza preditiva de nossa rede neural.

import pandas as pd
import numpy as np

#Defina os dias da semana
# Define the days of the week
days_of_week = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']

#Gere os dias de previsões do tempo de forma randomica. Note que são 40000 observacoes
# Generate random data for each column
weekday = np.random.choice(days_of_week, size=40000)
weather = np.random.choice(['Rainy', 'Sunny'], size=40000)
time_of_arrival = np.zeros(40000)

#Em uma versão alternativa, você pode comentar as 3 linhas acima (weekday... weather... e time_of_arrival... e descomentar as correspondentes abaixo, apagando o #
#Try with this sample, close to the observations of a 5 years, and see what happens :)
#weekday = np.random.choice(days_of_week, size=2000)
#weather = np.random.choice(['Rainy', 'Sunny'], size=2000)
#time_of_arrival = np.zeros(2000)

#Aqui os padroes são apresentados
#o tempo decresce com os dias da semana, caindo bastante na sexta
# Assign average time of arrival based on the patterns
###See that the time of arrival decrease from Monday to Thursday, but increase on Friday

for i in range(len(weekday)):
if weekday[i] == 'Monday':
time_of_arrival[i] = np.random.normal(loc=10.0, scale=1.0)
elif weekday[i] == 'Tuesday':
time_of_arrival[i] = np.random.normal(loc=9.5, scale=1.0)
elif weekday[i] == 'Wednesday':
time_of_arrival[i] = np.random.normal(loc=9.0, scale=1.0)
elif weekday[i] == 'Thursday':
time_of_arrival[i] = np.random.normal(loc=8.5, scale=1.0)
elif weekday[i] == 'Friday':
time_of_arrival[i] = np.random.normal(loc=5.0, scale=1.0)

#aqui o padrão de tempo, que aumenta o tempo quando chove
### # Increase time of arrival by 30% if the weather is rainy
if weather[i] == 'Rainy':
time_of_arrival[i] *= 1.3

#Aqui criamos a tabela/dataframe
# Create a DataFrame using the generated data
data = pd.DataFrame({'Day of the Week_TEXT': weekday,
'Weather_TEXT': weather,
'Time of Arrival': time_of_arrival})

# E aqui apresentamos as primeiras linhas pra chegagem
# Display the first few rows of the dataset
print(data.head())

Abraçando o poder das redes neurais

Com a tecnologia do renomado framework TensorFlow, construímos uma rede neural para desvendar os padrões em nosso conjunto de dados. Com o conjunto de dados codificado e pré-processado, nós o dividimos em conjuntos de treinamento e teste. Incorporamos camadas de dropout para aprimorar a generalização e evitar o overfitting. Com o modelo compilado e pronto para rodar, partimos para a fase de treinamento, onde a rede neural aprende com os dados, ajustando seus pesos para descobrir padrões ocultos.

#aqui importamos as bibliotecas do TensorFlow
import tensorflow as tf
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder, StandardScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout

# Aqui nós transformamos dia da semana e tempo em números.
#essa foi a parte que me deu mais trabalho, para reverter a transformação no final

encoder = LabelEncoder()
combined_labels = np.concatenate([data['Day of the Week_TEXT'].values, data['Weather_TEXT'].values])
encoder.fit(combined_labels)
data['Day of the Week'] = encoder.transform(data['Day of the Week_TEXT'])
data['Weather'] = encoder.transform(data['Weather_TEXT'])

#Pre processamento dos dados
# Preprocess the data
encoder = LabelEncoder()
combined_labels = np.concatenate([data['Day of the Week_TEXT'].values, data['Weather_TEXT'].values])
encoder.fit(combined_labels)
data['Day of the Week'] = encoder.transform(data['Day of the Week_TEXT'])
data['Weather'] = encoder.transform(data['Weather_TEXT'])
test_data = data.drop('Time of Arrival', axis=1)
columns_to_drop = ['Time of Arrival', 'Day of the Week_TEXT', 'Weather_TEXT']
X = data.drop(columns_to_drop, axis=1)
y = data['Time of Arrival']
scaler = StandardScaler()
X = scaler.fit_transform(X)

#Criação da tabela/dataframe com os dados
# Create a DataFrame with merged data
test_data = pd.concat([test_data, pd.DataFrame(X)], axis=1)

#divisão dos dados em treino e teste
# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

#Criação da Rede Neural.
#Note que a rede possui 2 "camadas ocultas" com 64 neurons cada, e uma camada de saída.
# Nas camadas ocultas a função de ativação é ReLU, ou Rectified Linear Unit
#O modelo é treinado para prever um único número baseado no input
# Create the neural network model
model = Sequential()
model.add(Dense(64, activation='relu', input_dim=X_train.shape[1]))
model.add(Dropout(0.2))
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(1, activation='linear'))

#aqui o modelo é compilado
# Compile the model
model.compile(loss='mean_squared_error', optimizer='adam')

#aqui o modelo é treinado
# Train the model
model.fit(X_train, y_train, epochs=50, batch_size=32, validation_data=(X_test, y_test))
model.evaluate(X_test, y_test, verbose=2)

Fazendo Previsões
À medida que nossa rede neural conclui seu treinamento, avaliamos seu desempenho usando o conjunto de teste. Chega a ser empolgante testemunhar a notável capacidade da rede neural de fazer previsões. Utilizamos o modelo treinado para prever horários de chegada com base em combinações distintas de dias da semana e condições climáticas, entrelaçando os segmentos de nosso conjunto de dados para revelar o futuro. As previsões se desdobram diante de nós, mostrando a proeza da rede neural em capturar a intrincada interação entre dias da semana, clima e horários de chegada.

Segue o código para criar as previsões, e com os resultados em seguida:

test_data = test_data.drop_duplicates()

#Todas as transformacoes abaixo buscam criar uma tabela/dataset
#com todas as combinacoes possives de dia da semana e tempo
#e as correspondencias de texto com número para fazer a previsao

# Create a dataset with columns 'Day of the Week_TEXT' and 'Weather_TEXT'
label_dataset = test_data[['Day of the Week_TEXT', 'Weather_TEXT']]

# Create a dataset with the data from X (converted to a numpy array)
predict_dataset = test_data.drop(['Day of the Week_TEXT', 'Weather_TEXT','Day of the Week','Weather'], axis=1).to_numpy()

# Make predictions on distinct values
predictions = model.predict(predict_dataset)
label_dataset_t = label_dataset.copy()

#print(len(predictions))
for i in range(len(predictions)):
label_dataset_t.loc[label_dataset_t.index[i], 'Predictions'] = predictions[i]

# Create a Categorical data type for 'Day of the Week_TEXT' column with the desired order
day_order = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
label_dataset_t['Day of the Week_TEXT'] = pd.Categorical(label_dataset_t['Day of the Week_TEXT'], categories=day_order, ordered=True)

# Create a Categorical data type for 'Weather_TEXT' column with the desired order
weather_order = ['Sunny', 'Rainy']
label_dataset_t['Weather_TEXT'] = pd.Categorical(label_dataset_t['Weather_TEXT'], categories=weather_order, ordered=True)

# Sort the dataset by 'Day of the Week_TEXT' and 'Weather_TEXT'
sorted_dataset = label_dataset_t.sort_values(by=['Day of the Week_TEXT', 'Weather_TEXT'])
print(sorted_dataset)

Resultados

Day of the Week_TEXT Weather_TEXT  Predictions
4 Monday Sunny 9.943331
14 Monday Rainy 9.893540
1 Tuesday Sunny 9.366679
6 Tuesday Rainy 9.343451
12 Wednesday Sunny 9.168489
16 Wednesday Rainy 9.106167
15 Thursday Sunny 8.593886
13 Thursday Rainy 8.640964
0 Friday Sunny 5.413193
2 Friday Rainy 6.673346

Assim como sua mente, o modelo conseguiu aprender e prever que aquela pessoa querida chegará cedo na sexta-feira, mas um pouco mais tarde nos dias de chuva.

Porém, o leitor mais atendo deve ter notado uma coisa no código: Para que o modelo pudesse aprender de maneira tão perfeita, ele necessitou, entre treino e teste, de 40.000 observações. Esse número equivale a mais de 100 anos de chegadas. Com uma pequena alteração no código (tirando uma parte que está comentada com #) o leitor mais curioso pode diminuir a amostra para 2.000 observações (o que ficaria mais próximo da sua experiência talvez, cerca de 5 anos de observação) e ver o que acontece com o modelo :)

Conclusão

Nossa exploração chegou ao fim, e espero que, assim como eu, você caro leitor tenha se aproximado um pouco mais dessa tecnologia tão falada hoje chamada inteligência artificial, e que na realidade, foi completamente inspirada na inteligência humana. Partindo da inspiração humana, das intrincadas conexões existentes no cérebro de cada um de nós, indo em direção aos neurônios digitais das redes neurais e sua capacidade gigantesca de processamento, testemunhamos o poder da adaptação, reconhecimento de padrões e previsão. Mergulhamos nos domínios da compreensão, impulsionando-nos para um futuro enriquecido por tudo que o aprendizado neural pode nos trazer.

Através desta jornada, passamos a apreciar as semelhanças e distinções entre os neurônios humanos e suas contrapartes digitais. Embora ambos compartilhem a capacidade de reconhecer e lembrar padrões, as redes neurais oferecem uma eficiência inigualável no processamento de grandes quantidades de dados. Com ferramentas como o TensorFlow, testemunhamos o treinamento e as capacidades preditivas de redes neurais, abrindo portas para novas possibilidades e insights.
Ao nos despedirmos de nossa exploração, carregamos conosco o conhecimento de que as redes neurais não são apenas algoritmos, mas criações que desvendam os segredos do reconhecimento de padrões e moldam nosso mundo. Eles têm o potencial de revolucionar indústrias, resolver problemas complexos e contribuir para o avanço da sociedade. Vamos continuar a abraçar o poder das redes neurais, ampliando os limites de nossa compreensão e aproveitando suas capacidades para criar um futuro onde abundam insights e previsões moldam nosso mundo. Na sinfonia da engenhosidade humana e inovação tecnológica, as redes neurais são um testemunho das extraordinárias possibilidades que nos esperam.

Link para o Notebook (Jupyter)

Complementary links:

--

--

Christian Zambra
productmanagerslife

Passionate to learn; believes that new products are made to change people’s life for better; Fuzzy AND Techie :) B. Engineering & Advertising. Alma Matter: USP