ELAI S.r.l.

La IA no puede leer nada: cómo una máscara vacía puede hacer que lo lea todo

La IA no puede leer nada: cómo una máscara vacía puede hacer que lo lea todo Un ejemplo explica método, supuestos y límites.

La IA no puede leer nada: cómo una máscara vacía puede hacer que lo lea todo

Una fila sin información permitida

Una máscara limita qué elementos puede leer el modelo, excluyendo relleno o posiciones fuera de ventana. ¿Qué devuelve la atención si no queda ninguno? Una sustitución aparentemente inocente convierte «no leer nada» en «promediarlo todo». Estudiamos tres valores con fórmula y política de fila vacía explícitas.

Pesos, valores y un denominador que debe existir

s_i representa compatibilidad y v_i el valor combinado. Softmax da pesos positivos que suman uno; la salida es su suma ponderada. Usamos s=(0,1,2), v=(10,20,90), sin unidades. Aislamos una operación sin dropout, proyecciones ni residuos, no una red entrenada, para separar fórmula y política del programa.

w_i = exp(s_i) / Σ_j exp(s_j); y = Σ_i w_i v_i

Sea A el conjunto permitido. El denominador suma solo A y las posiciones excluidas pesan cero. Restar el máximo permitido m evita desbordamiento; exp(−m) se cancela. El argumento exige A no vacío: sin elementos no existe el máximo empleado.

w_i = 1_(i∈A) exp(s_i−m) / Σ_(j∈A) exp(s_j−m), m=max_(j∈A) s_j

Permitir primera y tercera posición da pesos 1/(1+e²), cero, e²/(1+e²), y salida (10+90e²)/(1+e²), aproximadamente 80,464. El valor central 20 no participa. Los excluidos pesan exactamente cero y los admitidos suman uno: la máscara restringe soporte, no solo penaliza puntuaciones.

Softmax ordinaria no define el caso vacío

Con A vacío la suma exponencial es cero y no hay distribución normalizada sobre ese conjunto. Poner todo a menos infinito no lo resuelve: la resta estable intenta −∞−(−∞), y la normalización directa, 0/0. Es un problema de dominio, no algo «casi cero». El programa debe representar la ausencia de salida válida.

Sustituir todo excluido por −10^9 deja una fila constante. Restar el máximo da tres ceros, exponenciar tres unos y pesos 1/3. Sale (10+20+90)/3=40: leímos todos los valores prohibidos. Sumar la misma penalización finita conserva diferencias originales; es otra política, no enmascarado estricto.

CasoVálidoSalida
1180.463766
2040
300
Máscara parcial, sustitución finita y vacío explícito son operaciones distintas; el tercer cero requiere valid=False. Cálculo didáctico.
Máscara parcial, sustitución finita y vacío explícito son operaciones distintas; el tercer cero requiere valid=False. Cálculo didáctico.

Una política explícita, no una probabilidad inventada

Elegimos pesos cero, salida cero y valid=False para A vacío. No es distribución: suma cero. La rama precede al máximo y división, evitando aritmética inválida en vez de ocultarla. Otra aplicación puede rechazar o permitir explícitamente un elemento de respaldo. El contrato debe definir también gradientes, no ejecutados aquí.

El indicador importa: cero puede ser un valor auténtico y no distingue ausencia de información de media válida cero. Contribución de atención nula tampoco anula el bloque: proyecciones, sesgos y residuos añaden términos. La figura solo estudia la operación aislada, no otras rutas de información del modelo completo.

Comprobar por separado el contrato de la biblioteca

PyTorch 2.14 documenta softmax enmascarada y True como permitido en scaled_dot_product_attention, al contrario de otra API de padding. No ejecutamos PyTorch ni sus kernels vacíos: nuestro código no garantiza un backend. Hay que probar tipo, versión, exportación y ruta con máscaras vacías, parciales y completas.

Si nada es legible, softmax ordinaria no da una respuesta por sí sola. Un número muy negativo no equivale automáticamente a prohibición. Definir y probar la fila vacía evita que un valor finito plausible oculte lectura no deseada. Una rama pequeña cambia el significado.

PyTorch 2.14 — Attention and mask semantics.

import math,json,sys
from pathlib import Path
scores=[0.,1.,2.];values=[10.,20.,90.]
def attention(allowed):
 if not any(allowed):return dict(valid=False,weights=[0.]*3,output=0.)
 m=max(s for s,a in zip(scores,allowed) if a);e=[math.exp(s-m) if a else 0. for s,a in zip(scores,allowed)];z=sum(e);w=[x/z for x in e]
 return dict(valid=True,weights=w,output=sum(x*v for x,v in zip(w,values)))
partial=attention([True,False,True]);empty=attention([False]*3)
assert empty['output']==0 and not empty['valid'];assert partial['weights'][1]==0
assert abs(partial['output']-(10+90*math.exp(2))/(1+math.exp(2)))<1e-12
uniform=dict(valid=False,weights=[1/3]*3,output=sum(values)/3)
assert uniform['output']==40
r=dict(python=sys.version.split()[0],seed=None,scope='Explicit educational softmax policies, not execution of a PyTorch backend or trained model',scores=scores,values=values,partial=partial,emptyPolicy=empty,finiteReplacement=uniform,allNegativeInfinity='Stable subtraction attempts -inf-(-inf): undefined, not ordinary probability normalisation')
Path(__file__).with_name('results.json').write_text(json.dumps(r,indent=2),encoding='utf8')

Código, datos e instrucciones · JSON. Cálculos didácticos ejecutados con Python 3.14.0; figuras con Matplotlib 3.11.2. Análisis asistido por IA, sin afirmar revisión por pares ni humana. Portada original ImageGen ilustrativa: no documenta personas, sedes ni instalaciones de EL-AI. Fuentes consultadas el 25 de octubre de 2026.