ใน ep นี้เราจะมาใช้ Tensorboard ทำ Visualization ให้กับ Embedding ขนาด 50 มิติ Projector ให้ออกมาเป็น 3D กราฟสวย ๆ ให้เราสามารถหมุนไปมา เลือกกรองหนังเรื่องที่เราต้องการ ดูความใกล้เคียง ของหนังที่เกี่ยวข้อง เพื่อให้เราตีความ เข้าใจได้ง่ายขึ้น

ตัวอย่าง Tensorboard แสดง Projector ของ Embedding

Tensorboard แสดง Projector ข้อมูล Embedding ลดมิติด้วย T-SNE กรองเฉพาะ Star
Tensorboard แสดง Projector ข้อมูล Embedding ลดมิติด้วย T-SNE กรองเฉพาะ Star
Tensorboard แสดง Projector ข้อมูล Embedding ลดมิติด้วย T-SNE เริ่มทำงาน
Tensorboard แสดง Projector ข้อมูล Embedding ลดมิติด้วย T-SNE เริ่มทำงาน
Tensorboard แสดง Projector ข้อมูล Embedding ลดมิติด้วย T-SNE กรองเฉพาะ Love
Tensorboard แสดง Projector ข้อมูล Embedding ลดมิติด้วย T-SNE กรองเฉพาะ Love
Tensorboard แสดง Projector ข้อมูล Embedding ลดมิติด้วย PCA
Tensorboard แสดง Projector ข้อมูล Embedding ลดมิติด้วย PCA

เรามาเริ่มกันเลย

Open In Colab

ใน ep นี้เราจะมาใช้ tensorboard ให้ในทำ Visualization ข้อมูล Embedding ของหนังจาก MovieLens 100k กัน ส่วนรายละเอียดการเทรนโมเดล Collaborative Filtering ชุดข้อมูล MovieLens ขอให้ดู ep ก่อน ๆ

0. Magic Commands

เพิ่ม magic command ของ tensorboard

In [1]:
%reload_ext autoreload
%autoreload 2
%matplotlib inline

%load_ext tensorboard

ถ้ายังไม่มี tensorboard ให้ install ด้วย cell ด้านล่าง

In [2]:
# !conda install -y -c conda-forge tensorboard 

1. Import Library

In [3]:
from fastai import *
from fastai.collab import *
from fastai.tabular import *

import time
import numpy as np
import pandas as pd

from fastai_tensorboard_callback import *

ถ้ายังไม่ได้ติดตั้ง fastai_tensorboard_callback ให้ติดตั้งโดยรัน cell ด้านล่าง

In [4]:
# !pip install git+https://github.com/Pendar2/fastai-tensorboard-callback.git

2. ข้อมูล

รัน cell ด้านล่างเพื่อดาวน์โหลด Movielen-100k ไปใส่ไว้ที่ ~/.fastai/data/ml-100k แล้วแตกไฟล์

In [5]:
# ! wget http://files.grouplens.org/datasets/movielens/ml-100k.zip 
# ! mv ./ml-100k.zip ~/.fastai/data
# ! unzip ~/.fastai/data/ml-100k.zip -d ~/.fastai/data
In [6]:
path=Config.data_path()/'ml-100k'
In [7]:
user, item, title = 'userId', 'movieId', 'title'
In [8]:
dataframe_ratings = pd.read_csv(path/'u.data', 
                                delimiter='\t', header=None,
                                names=[user,item,'rating','timestamp'])

3. เตรียมข้อมูล

ข้อมูล Content

ถ้าเราดูแต่ movieId ก็จะไม่รู้ว่าเป็นหนังเรื่องไหน เราจะไปดึงข้อมูล Master ของ Movie มา merge และเพื่อนำไปแสดงบน Tensorboard ด้วย

In [9]:
dataframe_movies = pd.read_csv(path/'u.item',  delimiter='|', encoding='latin-1', header=None,
                    names=[item, 'title', 'date', 'N', 'url', *[f'g{i}' for i in range(19)]])
In [10]:
dataframe_rating_movie = dataframe_ratings.merge(dataframe_movies[[item, title]])
In [11]:
databunch = CollabDataBunch.from_df(dataframe_rating_movie, 
                                    seed=42, valid_pct=0.1)

สร้างไฟล์ Metadata ชื่อหนังไว้ไปแสดงบน Tensorboard

In [12]:
dataframe_movies[['movieId', 'title']].to_csv('movie_master.tsv', sep = '\t', index=False)

4. สร้างโมเดล

In [13]:
y_range = [0,5.5]
In [14]:
proj_id = '07b-tensorboard-embedding'
tboard_path = Path('data/tensorboard/' + proj_id)

print(f"tensorboard --logdir={tboard_path}")
tensorboard --logdir=data/tensorboard/07b-tensorboard-embedding
In [15]:
learner = collab_learner(databunch, n_factors=50, 
                         y_range=y_range, wd=1e-1)

สำหรับ clear logs

In [16]:
# ! rm -rf $tboard_path

เราสามารถดูเปิด Tensorboard ได้ 2 ทาง

  1. ใน Notebook ให้รัน cell magic command ด้านล่าง

  2. นอก Notebook เปิด Shell ใหม่ แล้วรันคำสั่ง tensorboard --logdir=./data/tensorboard/07b-tensorboard-embedding แล้วเปิดลิงค์ http://localhost:6006

เราอาจจะต้องรอให้เทรนผ่าน Epoch แรกไปก่อน ถึงจะเห็นกราฟ

In [17]:
%tensorboard --logdir=$tboard_path

ให้เลือกแท็บ Projector ในเมนูด้านซ้าย ให้เลือก Embeding ที่เป็น Item (Movie) แล้วกดปุ่ม Load เพื่ออัพโหลดไฟล์ movie_master.tsv ที่เตรียมไว้ด้านบน

tensorboard screenshot

5. เริ่มต้นเทรนโมเดล

เทรนด้วยค่า Default ไป 5 Cycle สามารถใช้ Learning Rate สูง ๆ ได้เลย

In [18]:
learner.fit_one_cycle(5, 5e-3, callbacks=[TensorboardLogger(learner,  
                                    f'Learner{time.time()}',
                                    path=tboard_path)])
epochtrain_lossvalid_losstime
00.9088880.93982400:18
10.8846380.88275600:17
20.7278060.83803400:17
30.6439200.81708500:15
40.5037020.81813600:15

สำเร็จแล้ว

เราสามารถใช้ Tensorboard ดู Embedding ภายในโมเดล ไม่ว่าจะใช้ Dimensional Reduction แบบ PCA, T-SNE, UMAP ไปถึงนำไป Present ได้อย่างสวยงาม

In [19]:
learner.save("07b-tensorboard-embedding")
In [20]:
learner.load("07b-tensorboard-embedding");

6. ดูผลลัพธ์

เปิดลิงค์ http://localhost:6006 ดูในแท็บ Projector

In [21]:
learner.model
Out[21]:
EmbeddingDotBias(
  (u_weight): Embedding(944, 50)
  (i_weight): Embedding(1672, 50)
  (u_bias): Embedding(944, 1)
  (i_bias): Embedding(1672, 1)
)

7. สรุป

  1. เราสามารถเรียกใช้ Tensorboard แสดง Embedding สวยงาม ได้ด้วยโค้ด callback ไม่กี่บรรทัด
  2. เราต้องเตรียม Metadata เช่น ชื่อ รูปประกอบ เพิ่มให้กับ Tensorboard ไม่งั้นจะเห็นแต่ ตัวเลข, ID ทำให้ดูไม่รู้เรื่อง
  3. แต่การตีความ Chart ของ Embedding จำเป็นต้องมีความรู้ความเข้าใจ ข้อมูลแบบหลายมิติ และการลดมิติ Dimensionality Reduction ที่เราจะอธิบายต่อไป

Credit

In [ ]:
 

ตัวอย่างการใช้ Search บน Tensorboard Projector

Tensorboard แสดง Projector ข้อมูล Embedding แสดงเรื่องใกล้เคียง กับเรื่องที่เราเลือก
Tensorboard แสดง Projector ข้อมูล Embedding แสดงเรื่องใกล้เคียง กับเรื่องที่เราเลือก
Tensorboard แสดง Projector ข้อมูล Embedding แสดงหนังเรื่อง Alien ทั้ง 4 ภาค ไม่ไกลกัน
Tensorboard แสดง Projector ข้อมูล Embedding แสดงหนังเรื่อง Alien ทั้ง 4 ภาค ไม่ไกลกัน

หมายเหตุ

และถ้าอยากลองเล่นโดยที่ไม่ต้อง Setup สามารถเข้าไปที่ https://projector.tensorflow.org/

แชร์ให้เพื่อน:

Keng Surapong on FacebookKeng Surapong on GithubKeng Surapong on Linkedin
Keng Surapong
Data Science Manager at Bua Labs
The ultimate test of your knowledge is your capacity to convey it to another.

Published by Keng Surapong

The ultimate test of your knowledge is your capacity to convey it to another.