diff --git a/README.md b/README.md index e37a884..f5825eb 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,7 @@ Beyond Self-Attention for Sequential Recommendation (BSARec) leverages Fourier t ![BSARec](fig/model_architecture.png) ## Updates +- (Nov 12, 2024) add visulaization code for figure 2(b) - (Oct 18, 2024) correct default argument for layer-specific values in FEARec - (Oct 18, 2024) rename variables in model checkpoint - (Oct 18, 2024) organize layer classes within each model file diff --git a/src/visualize/figure2.ipynb b/src/visualize/figure2.ipynb new file mode 100644 index 0000000..32253eb --- /dev/null +++ b/src/visualize/figure2.ipynb @@ -0,0 +1,205 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0623778c-e165-4c67-969a-67b3383149f3", + "metadata": {}, + "source": [ + "# Visualization Code for Figure 2(b)\n", + "- Figure 2(b shows the spectral responses of SASRec, DuoRec, FMLPRec, and BSARec ($A$ and $A_{IB}$).\n", + " - For SASRec, DuoRec, and BSARec ($A$), we visualize the spectral responses of the self-attention matrices.\n", + " - For FMLPRec, we visualize the spectral responses of the filter layer.\n", + "- This code provides visualization functions for SASRec and FMLPRec, which can be adapted for use with other models." + ] + }, + { + "cell_type": "markdown", + "id": "f0b6fcdc-4bf5-495a-baba-e9696d8ef6b3", + "metadata": {}, + "source": [ + "## 0. Import Modules" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "ba1b1072", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import scipy\n", + "import torch\n", + "import numpy as np\n", + "from scipy.linalg import dft\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "markdown", + "id": "3db52aae-79e8-4d37-8b7d-c5a37a92575a", + "metadata": {}, + "source": [ + "## 1. FFTShift\n", + "\n", + "- **Goal:** Rearrange the output of the Fast Fourier Transform (FFT) to center the zero-frequency component. " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "3a1c87f2-03fb-40fc-bd87-7c38506d1dbd", + "metadata": {}, + "outputs": [], + "source": [ + "def fftshift(arr, n=50):\n", + " \n", + " freq = scipy.fft.rfftfreq(50)\n", + " x = np.concatenate([np.flip(-freq[1:]), freq])\n", + " y = np.concatenate([np.flip(arr[1:]), arr])\n", + "\n", + " return x, y" + ] + }, + { + "cell_type": "markdown", + "id": "7eabd185-f594-46a0-913a-52350ebca7cb", + "metadata": {}, + "source": [ + "## 2. Spectral Responses of Self-Attention Matrix in SASRec\n", + "\n", + "- **What you need:**\n", + " - `Attention Matrix`: The attention matrix after applying the softmax function. In this code, we use an attention matrix with the shape (batch, n_heads, N, N), where N is the maximum sequence length (50).\n", + " - **How to obtain**: Simply save the attention matrix during evaluation.\n", + "- **How to calculate:**\n", + " - We follow the procedure outlined in Appendix F.2 of the paper *Anti-Oversmoothing in Deep Vision Transformers via the Fourier Domain Analysis: From Theory to Practice* (ICLR 2022).\n", + " - By treating the attention matrix $A$ as a linear filter, its Fourier-domain response can be represented by another linear kernel, $\\Lambda = F A F^{-1}$, where $F$ is the Fourier transform matrix." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "210d37a9", + "metadata": {}, + "outputs": [], + "source": [ + "file_path = 'sequence_output/LastFM_Spectral_Response/SASRec_attention_weight.npy'\n", + "attention_matrix = np.load(file_path)\n", + "\n", + "dft_matrix = dft(50)\n", + "idft_matrix = np.linalg.inv(dft_matrix)\n", + "\n", + "index = 75\n", + "head = 0\n", + "attention = attention_matrix[index, head]\n", + "sasrec_filter = dft_matrix @ attention @ idft_matrix\n", + "\n", + "sasrec_filter = np.abs(sasrec_filter.mean(axis=1)[:26])" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "076ebe33-0295-4688-af44-173b6ab7c472", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "x, sasrec_shifted_filter = fftshift(sasrec_filter)\n", + "plt.title('Spectral Responses of Self-Attention in SASRec')\n", + "plt.xlabel('Frequency')\n", + "plt.ylabel('Normalized Magnitude')\n", + "plt.plot(x, sasrec_shifted_filter / sasrec_shifted_filter.max())\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "2e6cb80b-7dd8-446f-9820-d2fb42f1c2b2", + "metadata": {}, + "source": [ + "## 3. Spectral Responses of Filter Layer in FMLPRec\n", + "\n", + "- **Requirements:**\n", + " - `Complex Weight`: The complex weight values (`self.complex_weight` as `nn.Parameter`) in `FMLPRecLayer`.\n", + " - **How to Obtain**: Simply save the values of trained `self.complex_weight`.\n", + "- **Calculation Steps:**\n", + " - Calculate the magnitude by finding $a^2 + b^2$ for each complex weight $z = a + bi$ in `self.complex_weight`." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "3f9b5f87-c640-4c5f-9d0a-0c918cd46f57", + "metadata": {}, + "outputs": [], + "source": [ + "file_path = 'sequence_output/LastFM_Spectral_Response/FMLPRec_complex_weight.npy'\n", + "complex_weight_layer = np.load(file_path)[0]\n", + "\n", + "filter_real = complex_weight_layer[:,:,0]\n", + "filter_imaginary = complex_weight_layer[:,:,1]\n", + "filter_abs = filter_real**2 + filter_imaginary**2\n", + "\n", + "fmlprec_filter = filter_abs.mean(axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "daf1adf9-c341-474d-9abc-c6e76118bb36", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "x, fmlprec_shifted_filter = fftshift(fmlprec_filter)\n", + "plt.title('Spectral Responses of Filter Layer in FMLPRec')\n", + "plt.xlabel('Frequency')\n", + "plt.ylabel('Normalized Magnitude')\n", + "plt.plot(x, fmlprec_shifted_filter / fmlprec_shifted_filter.max())\n", + "plt.show()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/src/visualize/figure.ipynb b/src/visualize/figure3.ipynb similarity index 99% rename from src/visualize/figure.ipynb rename to src/visualize/figure3.ipynb index d0e636a..0fb578b 100644 --- a/src/visualize/figure.ipynb +++ b/src/visualize/figure3.ipynb @@ -5,7 +5,8 @@ "id": "f0b6fcdc-4bf5-495a-baba-e9696d8ef6b3", "metadata": {}, "source": [ - "# 0. Import Modules" + "# Visualization Code for Figure 3\n", + "## 0. Import Modules" ] }, { @@ -35,7 +36,7 @@ "id": "7eabd185-f594-46a0-913a-52350ebca7cb", "metadata": {}, "source": [ - "# 1. Sequence Output\n", + "## 1. Sequence Output\n", "\n", "### Function `get_seqout`\n", "- **Goal:**\n", @@ -99,7 +100,7 @@ "id": "38188392-2a8c-4698-9e87-be10f28369f3", "metadata": {}, "source": [ - "# 2. Cosine Similarity\n", + "## 2. Cosine Similarity\n", "- Compute the cosine similarity for every pair of output sequences in the test dataset and then average these pairwise similarities. " ] }, @@ -158,7 +159,7 @@ "id": "3f7878b0-2755-445d-995d-734a41a7c5c7", "metadata": {}, "source": [ - "# 2. Singular Value\n", + "## 3. Singular Value\n", "- Compute the singular values of a matrix and divide each of them by the largest value to obtain the normalized singular values." ] }, diff --git a/src/visualize/sequence_output/LastFM_Spectral_Response/FMLPRec_complex_weight.npy b/src/visualize/sequence_output/LastFM_Spectral_Response/FMLPRec_complex_weight.npy new file mode 100644 index 0000000..c7ccdb9 Binary files /dev/null and b/src/visualize/sequence_output/LastFM_Spectral_Response/FMLPRec_complex_weight.npy differ diff --git a/src/visualize/sequence_output/LastFM_Spectral_Response/SASRec_attention_weight.npy b/src/visualize/sequence_output/LastFM_Spectral_Response/SASRec_attention_weight.npy new file mode 100644 index 0000000..3a25ead Binary files /dev/null and b/src/visualize/sequence_output/LastFM_Spectral_Response/SASRec_attention_weight.npy differ