Introducción

Cuando una persona abre Facebook, no ve todas las publicaciones disponibles en orden cronológico puro. Tampoco ve simplemente los posts con más likes. Lo que aparece en el Feed pasa por un sistema de ranking, es decir, un sistema que analiza publicaciones candidatas calcula probabilidades, asigna puntuaciones y decide qué contenido mostrar primero.


Este sistema está basado en machine learning y funciona con miles de señales relacionadas con el usuario, el contenido, el autor de la publicación y el contexto en el que la persona abre la aplicación.

Para entenderlo mejor, vamos a explicarlo de forma sencilla, pero con una capa técnica: veremos qué son las señales, cómo se calculan las probabilidades, qué significa el score de una publicación y cómo se puede representar el ranking del Feed con ecuaciones.

La idea central es esta:

El Feed no muestra simplemente “lo más reciente”.
El Feed intenta mostrar “lo más relevante para una persona específica en un momento específico”.

¿Qué problema intenta resolver el algoritmo del Feed?

Facebook tiene un problema enorme: cada usuario puede tener cientos o miles de publicaciones potenciales para ver. Estas publicaciones pueden venir de amigos, páginas, grupos, videos, enlaces, fotos, conversaciones activas o contenido que el usuario no alcanzó a ver en sesiones anteriores.

Si Facebook mostrara todo en orden cronológico, el usuario podría perderse contenido importante de personas cercanas, ver demasiadas publicaciones repetitivas o recibir contenido que no le interesa.

Por eso existe el ranking.

El ranking intenta responder esta pregunta:

¿Qué publicación tiene mayor probabilidad de generar valor para este usuario?

Ese valor puede venir de distintas acciones:

Like
Comentario
Compartido
Visualización de video
Conversación significativa
Tiempo de consumo
Interés en el tema
Calidad percibida
Relación con el autor

Pero también puede haber señales negativas:

Ocultar publicación
Reportar contenido
Ignorar el post
Pasar rápido sin consumir
Contenido repetitivo
Baja calidad
Señales de spam


Nota: Por eso el algoritmo no se reduce a “más likes = más alcance”. El sistema intenta calcular una estimación más completa del valor esperado de cada publicación.

Conceptos básicos para entender el ranking

Antes de entrar a ecuaciones, necesitamos definir algunos conceptos.

1. Usuario

Es la persona que abre Facebook.

En notación matemática podemos representarlo como:

j = usuario

Publicación candidata

Es cada post que podría aparecer en el Feed del usuario.

i = publicación candidata

Tiempo o contexto de sesión

El ranking no ocurre en el vacío. El momento importa: cuándo abre la app, qué acaba de hacer, qué publicaciones son recientes y qué contenido está activo.

t = momento en que el usuario abre Facebook

Señales o features

Las señales son datos que el modelo usa para hacer predicciones.

X_ijt = conjunto de señales de la publicación i para el usuario j en el tiempo t

Ejemplos de señales:

Tipo de publicación
Antigüedad del post
Relación entre usuario y autor
Interacciones recientes
Historial de consumo del usuario
Probabilidad de ver un video
Probabilidad de comentar
Temas de interés
Calidad del contenido
Señales de integridad

Predicción

El modelo intenta predecir si el usuario hará cierta acción.

Y_ijt = predicción de valor o acción esperada

Por ejemplo:

Y_like = probabilidad de que el usuario dé like
Y_comment = probabilidad de que comente
Y_share = probabilidad de que comparta
Y_watch = probabilidad de que vea el video
Y_hide = probabilidad de que oculte el contenido

Valor final o score

Después de calcular varias predicciones, el sistema necesita combinarlas en una puntuación final.

V_ijt = valor final de la publicación i para el usuario j en el tiempo t

Ese valor final ayuda a ordenar el Feed.

La primera fórmula: representar una publicación con señales

Una publicación no se evalúa solamente por su texto, imagen o número de likes. Se evalúa como un conjunto de características.

Podemos representarla así:

X_ijt = [x_ijt1, x_ijt2, x_ijt3, ..., x_ijtC]

Donde:

X_ijt = vector de señales
x_ijt1 = primera señal
x_ijt2 = segunda señal
x_ijt3 = tercera señal
C = número total de señales disponibles

Ejemplo aplicado:

x_ijt1 = tipo de contenido: video
x_ijt2 = antigüedad: 2 horas
x_ijt3 = relación usuario-autor: alta
x_ijt4 = comentarios recientes: 37
x_ijt5 = usuario suele ver videos similares: sí
x_ijt6 = tema: música regional
x_ijt7 = calidad estimada: alta


Nota: Agrega aqui el insight clave.En marketing digital, esto es importante porque cada publicación genera señales. No compites solamente con creatividad; compites con datos de comportamiento.


Predicción básica de una acción

El sistema puede usar las señales para predecir una acción.

La forma general sería:

Y_ijt = f(X_ijt)

Esto significa:

La predicción Y depende de una función aplicada sobre las señales X.

Por ejemplo, para predecir si el usuario dará like:

Y_like = P(like = 1 | X_ijt)

Esto se lee así:

Probabilidad de que el usuario dé like, dado el conjunto de señales de esa publicación.

Para predecir comentario:

Y_comment = P(comment = 1 | X_ijt)

Para predecir compartido:

Y_share = P(share = 1 | X_ijt)

Para predecir visualización:

Y_watch = P(watch = 1 | X_ijt)

Para predecir rechazo:

Y_hide = P(hide = 1 | X_ijt)


Aquí empezamos a ver algo importante: el algoritmo no piensa en una sola métrica. Piensa en muchas probabilidades al mismo tiempo.


Ejemplo con regresión logística

Una forma clásica de convertir señales en probabilidad es usar una función sigmoide, común en modelos de clasificación.

P(y = 1 | X) = 1 / (1 + e^-(w·X + b))

Donde:

P(y = 1 | X) = probabilidad de que ocurra la acción
X = vector de señales
w = pesos del modelo
b = bias o sesgo
e = constante matemática
w·X = combinación de señales ponderadas


En palabras simples:

Nota: El modelo toma muchas señales, les asigna pesos, las combina y las transforma en una probabilidad entre 0 y 1.


Ejemplo:

P(comment = 1 | X) = 0.68

Eso significa:

El modelo estima 68% de probabilidad de que este usuario comente esta publicación.

No quiere decir que el usuario definitivamente comentará. Significa que, con base en señales históricas y contextuales, la probabilidad estimada es alta.

El Feed usa múltiples objetivos

Un error común es pensar que Facebook solo busca maximizar likes.

En realidad, el sistema puede considerar múltiples objetivos:

Y_like
Y_comment
Y_share
Y_watch
Y_meaningful
Y_hide
Y_report
Y_skip

Cada objetivo representa una predicción diferente.

Por ejemplo:

Y_like = 0.40
Y_comment = 0.15
Y_share = 0.08
Y_watch = 0.75
Y_hide = 0.04

Esta publicación quizá no tiene altísima probabilidad de comentario, pero tiene alta probabilidad de reproducción. Entonces puede ser relevante para un usuario que consume mucho video.

Otra publicación podría tener bajo nivel de likes, pero alta probabilidad de generar conversación significativa. Para ciertos usuarios, esa publicación puede tener más valor que un post visualmente atractivo pero superficial.

Función de valor del contenido

Después de calcular varias predicciones, el sistema necesita convertirlas en una sola puntuación.

Una forma simplificada de representar esto es:

V_ijt = w1Y_like + w2Y_comment + w3Y_share + w4Y_watch - w5Y_hide

Donde:

V_ijt = valor final de la publicación
w1, w2, w3, w4, w5 = pesos asignados a cada predicción
Y_like = probabilidad de like
Y_comment = probabilidad de comentario
Y_share = probabilidad de compartir
Y_watch = probabilidad de ver el contenido
Y_hide = probabilidad de ocultarlo

En versión más general:

V_ijt = Σ w_ijtk · Y_ijtk

Esto se lee así:

El valor final de una publicación es la suma ponderada de múltiples predicciones.

Donde:

k = cada tipo de acción posible
w_ijtk = peso asignado a esa acción
Y_ijtk = probabilidad estimada de esa acción

Esta fórmula es clave para entender el ranking: no se trata de una métrica aislada, sino de una combinación de probabilidades.

Ejemplo numérico

Supongamos que Facebook evalúa una publicación para un usuario específico.

Predicciones:

P(like) = 0.40
P(comment) = 0.20
P(share) = 0.10
P(watch) = 0.75
P(hide) = 0.05

Pesos hipotéticos:

w_like = 1
w_comment = 3
w_share = 4
w_watch = 2
w_hide = 5

Cálculo:

V = (1)(0.40) + (3)(0.20) + (4)(0.10) + (2)(0.75) - (5)(0.05)

Resultado:

V = 0.40 + 0.60 + 0.40 + 1.50 - 0.25
V = 2.65

Ese 2.65 sería una puntuación estimada de valor para esa publicación.

Si hay varias publicaciones candidatas, cada una recibe su propio score.

Post A: V = 2.65
Post B: V = 1.40
Post C: V = 3.10
Post D: V = 0.80
Post E: V = 2.20

Ranking inicial:

1. Post C
2. Post A
3. Post E
4. Post B
5. Post D

Pero ese no siempre es el resultado final. Después pueden aplicarse reglas adicionales de diversidad, integridad, frescura y contexto.

Inventario: el primer paso del ranking

Antes de calcular scores, el sistema necesita reunir publicaciones candidatas.

A esto le podemos llamar inventario.

El inventario puede incluir:

Publicaciones nuevas de amigos
Publicaciones de grupos
Publicaciones de páginas seguidas
Posts no vistos de sesiones anteriores
Publicaciones antiguas con conversación reciente
Contenido que vuelve a ser relevante por nuevos comentarios

En pseudocódigo:

def obtener_inventario(usuario):
publicaciones = []

publicaciones += obtener_posts_de_amigos(usuario)
publicaciones += obtener_posts_de_grupos(usuario)
publicaciones += obtener_posts_de_paginas(usuario)
publicaciones += obtener_posts_no_vistos(usuario)
publicaciones += obtener_posts_con_conversacion_reciente(usuario)

return publicaciones

La idea es sencilla:

Primero se reúne el contenido posible.
Después se calcula qué tan valioso puede ser para el usuario.
Finalmente se ordena.

Scoring: calcular la puntuación de cada publicación

Una vez reunido el inventario, el sistema calcula señales y predicciones.

def extraer_features(post, usuario, contexto):
features = {
"tipo_post": post.tipo,
"edad_post": calcular_antiguedad(post.fecha),
"relacion_autor": medir_relacion(usuario, post.autor),
"interacciones_recientes": contar_interacciones(post),
"afinidad_tema": medir_afinidad(usuario, post.tema),
"historial_formato": medir_consumo_formato(usuario, post.tipo),
"calidad": estimar_calidad(post),
}

return features

Después se calculan predicciones:

def predecir_acciones(features):
y_like = modelo_like.predict(features)
y_comment = modelo_comment.predict(features)
y_share = modelo_share.predict(features)
y_watch = modelo_watch.predict(features)
y_hide = modelo_hide.predict(features)

return {
"like": y_like,
"comment": y_comment,
"share": y_share,
"watch": y_watch,
"hide": y_hide,
}

Y luego se calcula el score:

def calcular_score(predicciones):
score = (
1.0 * predicciones["like"] +
3.0 * predicciones["comment"] +
4.0 * predicciones["share"] +
2.0 * predicciones["watch"] -
5.0 * predicciones["hide"]
)

return score

Algoritmo completo del Feed

Una versión didáctica del ranking sería:

Algoritmo: Ranking del Feed

Entrada:
Usuario j
Tiempo t
Conjunto de publicaciones candidatas I

Paso 1:
Recolectar publicaciones elegibles para el usuario.

Paso 2:
Para cada publicación i en I:
Extraer señales X_ijt.

Paso 3:
Para cada publicación i:
Predecir múltiples acciones:
Y_like
Y_comment
Y_share
Y_watch
Y_hide
Y_meaningful

Paso 4:
Calcular valor final:
V_ijt = Σ w_ijtk · Y_ijtk

Paso 5:
Ordenar publicaciones por V_ijt de mayor a menor.

Paso 6:
Aplicar reglas de integridad, diversidad, frescura y contexto.

Paso 7:
Mostrar el Feed final al usuario.

En Python simplificado:

def rankear_feed(usuario, contexto):
inventario = obtener_inventario(usuario)
resultados = []

for post in inventario:
features = extraer_features(post, usuario, contexto)
predicciones = predecir_acciones(features)
score = calcular_score(predicciones)

resultados.append({
"post": post,
"score": score,
"predicciones": predicciones
})

ranking_inicial = sorted(
resultados,
key=lambda item: item["score"],
reverse=True
)

feed_final = aplicar_reglas_contextuales(ranking_inicial, usuario, contexto)

return feed_final


*Este código no es el sistema real de Facebook, pero representa la lógica conceptual del ranking: inventario, señales, predicciones, score, ordenamiento y ajustes finales.

**Este artículo está basado en la explicación técnica de Meta, donde describen el ranking del Feed con inventario de publicaciones, predicciones Y_ijt, valor final V_ijt, modelos multitarea, embeddings, feed aggregator, ranking en pases y una combinación lineal de predicciones para el score final.