File size: 4,172 Bytes
9382e3f |
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 |
<!--Copyright 2023 The HuggingFace Team. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
specific language governing permissions and limitations under the License.
鈿狅笍 Note that this file is in Markdown but contain specific syntax for our doc-builder (similar to MDX) that may not be
rendered properly in your Markdown viewer.
-->
# Mecanismos de atenci贸n
La mayor铆a de los modelos transformers utilizan atenci贸n completa, en el sentido de que la matriz de atenci贸n es cuadrada. Esto puede ser un gran cuello de botella computacional cuando tienes textos largos. `Longformer` y `reformer` son modelos que intentan ser m谩s eficientes y utilizan una versi贸n dispersa de la matriz de atenci贸n para acelerar el entrenamiento.
## Atenci贸n LSH
[Reformer](https://huggingface.co/docs/transformers/model_doc/reformer) utiliza atenci贸n LSH. En el softmax(QK^t), solo los elementos m谩s grandes (en la dimensi贸n softmax) de la matriz QK^t van a dar contribuciones 煤tiles. Entonces, para cada consulta q en Q, podemos considerar solo las claves k en K que est茅n cerca de q. Se utiliza una funci贸n hash para determinar si q y k est谩n cerca. La m谩scara de atenci贸n se modifica para enmascarar el token actual (excepto en la primera posici贸n), porque dar谩 una consulta y una clave iguales (entonces muy similares entre s铆). Dado que el hash puede ser un poco aleatorio, en la pr谩ctica se utilizan varias funciones hash (determinadas por un par谩metro n_rounds) y luego se promedian juntas.
## Atenci贸n local
[Longformer](https://huggingface.co/docs/transformers/model_doc/longformer) utiliza atenci贸n local: a menudo, el contexto local (por ejemplo, 驴cu谩les son los dos tokens a la izquierda y a la derecha?) es suficiente para tomar acci贸n para un token dado. Adem谩s, apilando capas de atenci贸n que tienen una ventana peque帽a, la 煤ltima capa tendr谩 un campo receptivo mayor que solamente los tokens en la ventana, lo que les permite construir una representaci贸n de toda la oraci贸n.
Algunos tokens de entrada preseleccionados tambi茅n reciben atenci贸n global: para esos pocos tokens, la matriz de atenci贸n puede acceder a todos los tokens y este proceso es sim茅trico: todos los dem谩s tokens tienen acceso a esos tokens espec铆ficos (adem谩s de los que est谩n en su ventana local). Esto se muestra en la Figura 2d del art铆culo, el cual se puede apreciar un ejemplo de una m谩scara de atenci贸n:
<div class="flex justify-center">
<img scale="50 %" align="center" src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/local_attention_mask.png"/>
</div>
El uso de dichas matrices de atenci贸n con menos par谩metros permite que el modelo tenga entradas con una longitud de secuencia mayor.
## Otros trucos
### Codificaci贸n posicional axial
[Reformer](https://huggingface.co/docs/transformers/model_doc/reformer) utiliza codificaci贸n posicional axial: en los modelos transformers tradicionales, la codificaci贸n posicional E es una matriz de tama帽o \\(l\\) por \\(d\\), donde \\(l\\) es la longitud de la secuencia y \\(d\\) es la dimensi贸n del estado oculto. Si tienes textos muy extensos, esta matriz puede ser enorme y ocupar demasiado espacio en la GPU. Para aliviar eso, las codificaciones posicionales axiales consisten en factorizar esa gran matriz E en dos matrices m谩s peque帽as E1 y E2, con dimensiones \\(l_{1} \times d_{1}\\) y \\(l_{2} \times d_{2}\\), tal que \\(l_{1} \times l_{2} = l\\) y \\(d_{1} + d_{2} = d\\) (con el producto de las longitudes, esto termina siendo mucho m谩s peque帽o). La incrustaci贸n (embedding) para el paso de tiempo \\(j\\) en E se obtiene concatenando las incrustaciones para el paso de tiempo \\(j \% l1\\) en E1 y \\(j // l1\\) en E2.
|