ݺߣ

ݺߣShare a Scribd company logo
ИТМО Machine Learning. Рекомендательные системы — часть 2
Рекомендательные 
системы 
Лекция 2 
Андрей Данильченко 
НИУ ИТМО, 17 ноября 2014
Как объяснять 
рекомендации?
Вам понравится Y! 
Если вам нравится X, то 
попробуйте Y…
Item-based model explanation 
Модель: ˆ rui = wijrui 
Σ 
k 
j∈Nu 
Вклад в рейтинг: wijrui 
Выберем j с максимальными вкладами — 
это и есть объяснение! 
j
ALS explanation 
Модель: ˆ rui = yi 
T (λ I +Y TY )−1 
T xu = yi 
Y Tr (u) 
Σ u 
ruj 
ˆ rui = sij 
(u,i)∈R 
1 
Wu = ( Y TY +λ I )−su = yTWuyij 
i 
j 
Тогда перепишем модель как 
urj uj 
Вклад в рейтинг: sij 
Выберем j с максимальными вкладами — 
это и есть объяснение!
ALS explanation 
Модель: ˆ rui = yi 
T (λ I +Y TY )−1 
T xu = yi 
Y Tr (u) 
Σ 
ˆ rui = Vuqi ( )T Vuqj ( )ruj 
(u,i)∈R 
1 
Wu = ( Y TY +λ I )−su = yTWuyij 
i 
j 
Перепишем модель как 
Wu =Vu 
TVu 
Vu Тогда можно рассматривать как шаблон 
пользовательского мнения про item-ы
iALS explanation 
Модель: ˆpui = yi 
T (λ I +Y TCuY )−1 
T xu = yi 
Y TCu p(u) 
Σ u 
cpuj uj 
ˆpui = sij 
pui>0 
Wu = ( Y TCuY +λ I )−1 
su = yTWuyij 
i 
j 
Тогда перепишем модель как 
j ucp= sucuj uj ij 
uj 
Вклад в рейтинг: sij 
Выберем j с максимальными вкладами — 
это и есть объяснение!
Как еще можно выиграть 
Netflix Prize?
Restricted Boltzmann Machine (for user) 
F — # of features 
Missing 
Missing 
Missing 
Missing 
h 
W 
V 
Binary hidden units 
Visible movie ratings 
… … 
# of movies 
Weights 
(shared between all users)
Model distributions 
For n users, m movies, ratings from 1 to K, binary features from 1 to F: 
k =1| 
p vi 
! 
( h) = 
FΣ 
k + hjWij 
exp bi 
k 
j=1 
" 
# $$ 
% 
& '' 
FΣ 
l + hjWij 
exp bi 
l 
j=1 
" 
# $$ 
% 
& '' 
KΣ 
l=1 
p hj =1| 
! 
KΣ 
mΣ 
( V) =σ bj + vi 
kWij 
k 
k=1 
i=1 
" 
# $ 
% 
& ' 
, где 
1 
σ (x) = 
1+ e−x p 
! 
(V) = 
exp −E 
! 
V, 
! 
( ( h)) 
! 
exp −E 
V ', 
! 
! ( ( h ')) 
Σ 
! Σ 
! 
V ', 
h ' h 
E 
( ! 
! 
V, 
h) = − Wij 
khjvi 
k 
KΣ 
k=1 
FΣ 
j=1 
mΣ 
i=1 
, где энергия задается как 
kbi 
KΣ 
mΣ 
− vi 
k 
k=1 
i=1 
FΣ 
− hjbj 
j=1
Обучение — data part 
%% 
k =ε 
ΔWij 
! 
( V)) 
∂Wij 
∂log p( 
k 
# 
$ 
& 
(( 
' 
( khkh) 
j data 
j predicted =ε vi 
− vi 
Получаем из данных: 
1. для каждого обучающего примера v, выведем h 
2. посчитаем частоту, с которой фильм i получил рейтинг k при 
соответствующем h
Обучение — model part 
%% 
k =ε 
ΔWij 
! 
( V)) 
∂Wij 
∂log p( 
k 
# 
$ 
& 
(( 
' 
( khkh) 
j data 
j predicted =ε vi 
− vi 
Трудно получать аналитически, работает экспоненциальное время
Contrastive divergence 
%% 
k =ε 
ΔWij 
! 
( V)) 
∂Wij 
∂log p( 
k 
# 
$ 
& 
(( 
' 
( khkh) ≈ 
j data 
j predicted =ε vi 
− vi 
( khkh) 
j data 
j recon ≈ε vi 
− vi 
Восстановим из данных: 
1. для каждого обучающего примера v, выведем h 
2. восстановим v’ из h 
3. посчитаем “reconstruct”-часть
Sampling reconstruction part in CD 
khj recon ( ) =ε vi 
k =ε vi 
ΔWij 
khj data 
− vi 
( kh− vkh) 
j data 
i 
j T Будем сэмплировать по Гиббсу из распределений, 
делая T шагов. 
k =1| 
p vi 
! 
( h) 
! 
p h=1| 
j ( V) 
Начальная точка сэмплирования — наблюдаемые данные 
Количество шагов T будем увеличивать в процессе обучения. 
Таким образом мы будем получать все более «точные» приближения.
Gibbs sampling 
Пускай есть d случайных величин и дано их совместное распределение 
p x1, x2…xd ( ) 
Пусть на шаге t уже выбрано приближение Xt = xi 
d 
t { }i=1 
Тогда на t+1 шаге: 
1. выберем индекс i 
t ( ) 
t+1 p xi | x1 
2. выберем x по распределению i 
t…xi−1 
t …xd 
t , xi+1 
Обычно индекс выбирается как i = (t +1)%d
Общая схема обучения 
1. посчитаем data-part (для каждого пользователя и его рейтинга) 
2. выведем reconstruction-part для данного рейтинга 
3. усредним градиенты по всем пользователям 
4. запустим log-likelihood gradient ascend
Как предсказывать 
рейтинги?
Предсказание рейтингов 
k =1| 
p vi 
! 
( V)∝ exp −E vq 
Σ k, 
∝ 
! 
V, 
! 
( ( h)) 
h1…hp 
Σ + vi 
Σ 
FΠ 
k exp vi 
∝Γq 
lhjWij 
l 
il 
khjWij 
k + hjbj 
% 
& ' 
( 
) * 
hj∈{0,1} 
j=1 
= 
Σ + vi 
FΠ где Γq 
k 1+ exp vi 
= Γq 
lWij 
l 
il 
kWij 
k + bj 
% 
& ' 
( 
) * 
% 
& '' 
( 
) ** 
j=1 
k ( ) 
k = exp vq 
kbq 
Получили вероятность, что пользователь поставит фильму i оценку k
Что делать с вероятностями? 
Два варианта: 
1. просто взять оценку, у которой вероятность максимальна 
2. нормализовать вероятности так, чтобы 
p(vi = k) 
KΣ 
k=1 
=1 
и посчитать предсказание как E vi [ ]
Предсказание множества рейтингов 
21 
Если требуется предсказать рейтинги для n фильмов, то 
можно посчитать вероятность: 
k1 =1, vq2 
p vq1 
k2 =1,…, vqn 
kn =1| 
! 
( V) 
Но это требует O(Kn) времени!
Multi-predict trick 
22 
Давайте сделаем один update-шаг: 
ˆpj = p hj =1| 
! 
KΣ 
mΣ 
( V) =σ bj + vi 
kWij 
k 
k=1 
i=1 
" 
# $ 
% 
& ' 
k ( =1| pˆ) = 
p vq 
FΣ 
k + ˆpjWqj 
exp bq 
k 
j=1 
" 
% 
'' 
& $$# FΣ 
k + ˆpjWqj 
exp bq 
l 
j=1 
" 
# $$ 
% 
& '' 
KΣ 
l=1 
И снова вычислим предсказания как матожидание. 
Это немного хуже по качеству, но намного быстрее!
Gaussian hidden units 
23 
Можно ввести расширение модели, считая скрытые переменные 
гауссовскими. Тогда вероятности в модели примут вид: 
k =1| 
p vi 
! 
( h) = 
FΣ 
k + hjWij 
exp bi 
k 
j=1 
" 
# $$ 
% 
& '' 
FΣ" 
# $$ 
l + hjWij 
exp bi 
l 
j=1 
% 
& '' 
KΣ 
l=1 
p hj = h | 
! 
( V) = 
1 
2Πσ i 
&&&&& 
exp − 
kWij 
KΣ 
mΣ 
h − bj −σ j vi 
k 
k=1 
i=1 
$ 
% & 
' 
( ) 
2 
2 
2σ i 
$ 
% 
' 
))))) 
( 
N.B. для единичной дисперсии формулы обновления те же!
Как измерить качество? 
или еще раз о метриках
Prediction quality 
RMSE = 
1 
| R | 
Σ ( 2 
r− rˆ ) 
ui ui u,i∈R 
MAE = 
1 
R 
rui − ˆ rui 
Σ 
u,i∈R
Classification quality 
Истинный ответ 0 Истинный ответ 1 
Confusion matrix: 
Предсказали 0 TN FN 
Предсказали 1 FP TP 
P = 
TP 
TP + FP 
R = 
TP 
TP + FN 
F1 = 
2 
1 
P 
+ 
1 
R 
Precision: 
Recall:
More on classification quality 
nΣ 
AP = P(k)Δr(k) 
k=1 
MAP = 
AP(q) 
Σ 
q∈Q 
Q 
Average precision: 
Mean average precision: 
MAP — средняя точность на позициях, где есть попадания в top k.
Ranking quality (NDPM) 
Σ 
C+ = sgn rui − ruj ( )sgn ˆ rui − ˆ ruj ( ) 
ij 
Σ 
C− = sgn rui − ruj ( )sgn ˆ ruj − ˆ rui ( ) 
ij 
Σ 
Cu = sgn2 rui − ruj ( ) 
ij 
Σ 
Cs = sgn2 ˆ rui − ˆ ruj ( ) 
ij 
Cu0 = Cu − C+ +C− ( ) 
NDPM = 
C− + 1 
2 Cu0 
Cu
Ranking quality (NDCG) 
Пусть для каждого пользователя и item-а задана «релевантность» r 
DCGu = r1 + 
nΣ 
ri 
log2 i i=2 
NDCGu = 
DCGu 
IDCGu 
NDCG = 
NDCGu 
U
Как оптимизировать 
ранжирование? 
30
│ Давайте смотреть на 
порядок пар!
BPR: problem setting 
Для пользователей u из U и фильмов i из I составим обучающее множество 
как тройки: 
+ ^ j ∈ I  Iu 
DS = {(u, i, j) : i ∈ Iu 
+} 
+ — фильмы с implicit feedback для данного пользователя 
где Iu 
>u — полный порядок на фильмах, причем выполняются свойства: 
∀i, j ∈ I : i ≠ j⇒i >u j∨ j >u i 
∀i, j ∈ I : i >u j ^ j >u i⇒i = j 
∀i, j, k ∈ I : i >u j ^ j >u k ⇒i >u k 
полнота 
антисимметричность 
транзитивность
Байесовская формулировка 
p(Θ|>u )∝ p(>u |Θ) p(Θ) 
Тогда для всех пользователей запишем: 
Π p ( Θ|>) 
= p ( i >δ j |Θ)((u,i, j )∈DS ) 
u u u∈U 
Π ⋅ 
u,i, j∈U×I×I 
⋅ 1− p i >u ( ( j |Θ))δ ((u,i, j )∉DS ) 
Тогда по свойствам порядка это можно упростить: 
Π p ( Θ|>) 
= p ( i >j |Θ) 
u u u∈U 
Π 
u,i, j∈Ds
Preference model 
Окончательно определим модель как: 
p(i >u j |Θ) =σ (xˆuij (Θ)) 
Здесь ˆ xuij — «встроенная» модель, которая отслеживает 
связь между u, i и j. Например, 
- матричное разложение 
- модель kNN
BPR-Opt 
Предположим, наконец, априорное распределение параметров: 
p(Θ) = N(0,ΣΘ) 
Тогда весь алгоритм: BPR −Opt := ln p Θ|>u ( ) 
= ln p >u ( |Θ) p(Θ) 
= ln σ ˆ xuij ( (Θ)) p(Θ) 
Π 
(u,i, j )∈Ds 
Σ σ ˆ xuij ( (Θ))+ ln p(Θ) 
= ln 
(u,i, j )∈Ds 
Σ σ ˆ xuij ( (Θ))−λΘ Θ 2 
= ln 
(u,i, j )∈Ds
LearnBPR 
1. Инициализируем параметры Θ 
2. Пока не достигнута сходимость: 
1. Выберем пример из Ds 
Θ←Θ+α 
exp(− ˆ xuij ) 
1+ exp(− ˆ xuij ) 
3. Вернем финальные параметры 
⋅ 
∂ 
∂Θ 
ˆ xuij +λΘΘ 
& 
) 
++ 
* ((' 2.
Еще раз о модели рейтинга 
Распишем ˆ xuij = ˆ xui − ˆ xuj 
В случае разложения матриц 
kΣ 
ˆ xui = wu, hi = wuf hif 
f =1 
Тогда производные распишутся как 
∂ˆ xuij 
∂θ 
= 
(hif − hjf ) 
wuf 
−wuf 
0 
если θ = wuf 
если θ = hif 
если θ = hjf 
иначе
If you like this lecture you will like these books
If you like this lecture you will probably like 
http://www.4ducks.ru/pages/itmo-rs-2014.html
Удачи! 
Андрей Данильченко 
группа разработки рекомендательных систем, Яндекс 
danilchenko@yandex-team.ru 
http://www.4ducks.ru/itmo-ml-course-recsys-part-2.html

More Related Content

ИТМО Machine Learning. Рекомендательные системы — часть 2

  • 2. Рекомендательные системы Лекция 2 Андрей Данильченко НИУ ИТМО, 17 ноября 2014
  • 4. Вам понравится Y! Если вам нравится X, то попробуйте Y…
  • 5. Item-based model explanation Модель: ˆ rui = wijrui Σ k j∈Nu Вклад в рейтинг: wijrui Выберем j с максимальными вкладами — это и есть объяснение! j
  • 6. ALS explanation Модель: ˆ rui = yi T (λ I +Y TY )−1 T xu = yi Y Tr (u) Σ u ruj ˆ rui = sij (u,i)∈R 1 Wu = ( Y TY +λ I )−su = yTWuyij i j Тогда перепишем модель как urj uj Вклад в рейтинг: sij Выберем j с максимальными вкладами — это и есть объяснение!
  • 7. ALS explanation Модель: ˆ rui = yi T (λ I +Y TY )−1 T xu = yi Y Tr (u) Σ ˆ rui = Vuqi ( )T Vuqj ( )ruj (u,i)∈R 1 Wu = ( Y TY +λ I )−su = yTWuyij i j Перепишем модель как Wu =Vu TVu Vu Тогда можно рассматривать как шаблон пользовательского мнения про item-ы
  • 8. iALS explanation Модель: ˆpui = yi T (λ I +Y TCuY )−1 T xu = yi Y TCu p(u) Σ u cpuj uj ˆpui = sij pui>0 Wu = ( Y TCuY +λ I )−1 su = yTWuyij i j Тогда перепишем модель как j ucp= sucuj uj ij uj Вклад в рейтинг: sij Выберем j с максимальными вкладами — это и есть объяснение!
  • 9. Как еще можно выиграть Netflix Prize?
  • 10. Restricted Boltzmann Machine (for user) F — # of features Missing Missing Missing Missing h W V Binary hidden units Visible movie ratings … … # of movies Weights (shared between all users)
  • 11. Model distributions For n users, m movies, ratings from 1 to K, binary features from 1 to F: k =1| p vi ! ( h) = FΣ k + hjWij exp bi k j=1 " # $$ % & '' FΣ l + hjWij exp bi l j=1 " # $$ % & '' KΣ l=1 p hj =1| ! KΣ mΣ ( V) =σ bj + vi kWij k k=1 i=1 " # $ % & ' , где 1 σ (x) = 1+ e−x p ! (V) = exp −E ! V, ! ( ( h)) ! exp −E V ', ! ! ( ( h ')) Σ ! Σ ! V ', h ' h E ( ! ! V, h) = − Wij khjvi k KΣ k=1 FΣ j=1 mΣ i=1 , где энергия задается как kbi KΣ mΣ − vi k k=1 i=1 FΣ − hjbj j=1
  • 12. Обучение — data part %% k =ε ΔWij ! ( V)) ∂Wij ∂log p( k # $ & (( ' ( khkh) j data j predicted =ε vi − vi Получаем из данных: 1. для каждого обучающего примера v, выведем h 2. посчитаем частоту, с которой фильм i получил рейтинг k при соответствующем h
  • 13. Обучение — model part %% k =ε ΔWij ! ( V)) ∂Wij ∂log p( k # $ & (( ' ( khkh) j data j predicted =ε vi − vi Трудно получать аналитически, работает экспоненциальное время
  • 14. Contrastive divergence %% k =ε ΔWij ! ( V)) ∂Wij ∂log p( k # $ & (( ' ( khkh) ≈ j data j predicted =ε vi − vi ( khkh) j data j recon ≈ε vi − vi Восстановим из данных: 1. для каждого обучающего примера v, выведем h 2. восстановим v’ из h 3. посчитаем “reconstruct”-часть
  • 15. Sampling reconstruction part in CD khj recon ( ) =ε vi k =ε vi ΔWij khj data − vi ( kh− vkh) j data i j T Будем сэмплировать по Гиббсу из распределений, делая T шагов. k =1| p vi ! ( h) ! p h=1| j ( V) Начальная точка сэмплирования — наблюдаемые данные Количество шагов T будем увеличивать в процессе обучения. Таким образом мы будем получать все более «точные» приближения.
  • 16. Gibbs sampling Пускай есть d случайных величин и дано их совместное распределение p x1, x2…xd ( ) Пусть на шаге t уже выбрано приближение Xt = xi d t { }i=1 Тогда на t+1 шаге: 1. выберем индекс i t ( ) t+1 p xi | x1 2. выберем x по распределению i t…xi−1 t …xd t , xi+1 Обычно индекс выбирается как i = (t +1)%d
  • 17. Общая схема обучения 1. посчитаем data-part (для каждого пользователя и его рейтинга) 2. выведем reconstruction-part для данного рейтинга 3. усредним градиенты по всем пользователям 4. запустим log-likelihood gradient ascend
  • 19. Предсказание рейтингов k =1| p vi ! ( V)∝ exp −E vq Σ k, ∝ ! V, ! ( ( h)) h1…hp Σ + vi Σ FΠ k exp vi ∝Γq lhjWij l il khjWij k + hjbj % & ' ( ) * hj∈{0,1} j=1 = Σ + vi FΠ где Γq k 1+ exp vi = Γq lWij l il kWij k + bj % & ' ( ) * % & '' ( ) ** j=1 k ( ) k = exp vq kbq Получили вероятность, что пользователь поставит фильму i оценку k
  • 20. Что делать с вероятностями? Два варианта: 1. просто взять оценку, у которой вероятность максимальна 2. нормализовать вероятности так, чтобы p(vi = k) KΣ k=1 =1 и посчитать предсказание как E vi [ ]
  • 21. Предсказание множества рейтингов 21 Если требуется предсказать рейтинги для n фильмов, то можно посчитать вероятность: k1 =1, vq2 p vq1 k2 =1,…, vqn kn =1| ! ( V) Но это требует O(Kn) времени!
  • 22. Multi-predict trick 22 Давайте сделаем один update-шаг: ˆpj = p hj =1| ! KΣ mΣ ( V) =σ bj + vi kWij k k=1 i=1 " # $ % & ' k ( =1| pˆ) = p vq FΣ k + ˆpjWqj exp bq k j=1 " % '' & $$# FΣ k + ˆpjWqj exp bq l j=1 " # $$ % & '' KΣ l=1 И снова вычислим предсказания как матожидание. Это немного хуже по качеству, но намного быстрее!
  • 23. Gaussian hidden units 23 Можно ввести расширение модели, считая скрытые переменные гауссовскими. Тогда вероятности в модели примут вид: k =1| p vi ! ( h) = FΣ k + hjWij exp bi k j=1 " # $$ % & '' FΣ" # $$ l + hjWij exp bi l j=1 % & '' KΣ l=1 p hj = h | ! ( V) = 1 2Πσ i &&&&& exp − kWij KΣ mΣ h − bj −σ j vi k k=1 i=1 $ % & ' ( ) 2 2 2σ i $ % ' ))))) ( N.B. для единичной дисперсии формулы обновления те же!
  • 24. Как измерить качество? или еще раз о метриках
  • 25. Prediction quality RMSE = 1 | R | Σ ( 2 r− rˆ ) ui ui u,i∈R MAE = 1 R rui − ˆ rui Σ u,i∈R
  • 26. Classification quality Истинный ответ 0 Истинный ответ 1 Confusion matrix: Предсказали 0 TN FN Предсказали 1 FP TP P = TP TP + FP R = TP TP + FN F1 = 2 1 P + 1 R Precision: Recall:
  • 27. More on classification quality nΣ AP = P(k)Δr(k) k=1 MAP = AP(q) Σ q∈Q Q Average precision: Mean average precision: MAP — средняя точность на позициях, где есть попадания в top k.
  • 28. Ranking quality (NDPM) Σ C+ = sgn rui − ruj ( )sgn ˆ rui − ˆ ruj ( ) ij Σ C− = sgn rui − ruj ( )sgn ˆ ruj − ˆ rui ( ) ij Σ Cu = sgn2 rui − ruj ( ) ij Σ Cs = sgn2 ˆ rui − ˆ ruj ( ) ij Cu0 = Cu − C+ +C− ( ) NDPM = C− + 1 2 Cu0 Cu
  • 29. Ranking quality (NDCG) Пусть для каждого пользователя и item-а задана «релевантность» r DCGu = r1 + nΣ ri log2 i i=2 NDCGu = DCGu IDCGu NDCG = NDCGu U
  • 31. │ Давайте смотреть на порядок пар!
  • 32. BPR: problem setting Для пользователей u из U и фильмов i из I составим обучающее множество как тройки: + ^ j ∈ I Iu DS = {(u, i, j) : i ∈ Iu +} + — фильмы с implicit feedback для данного пользователя где Iu >u — полный порядок на фильмах, причем выполняются свойства: ∀i, j ∈ I : i ≠ j⇒i >u j∨ j >u i ∀i, j ∈ I : i >u j ^ j >u i⇒i = j ∀i, j, k ∈ I : i >u j ^ j >u k ⇒i >u k полнота антисимметричность транзитивность
  • 33. Байесовская формулировка p(Θ|>u )∝ p(>u |Θ) p(Θ) Тогда для всех пользователей запишем: Π p ( Θ|>) = p ( i >δ j |Θ)((u,i, j )∈DS ) u u u∈U Π ⋅ u,i, j∈U×I×I ⋅ 1− p i >u ( ( j |Θ))δ ((u,i, j )∉DS ) Тогда по свойствам порядка это можно упростить: Π p ( Θ|>) = p ( i >j |Θ) u u u∈U Π u,i, j∈Ds
  • 34. Preference model Окончательно определим модель как: p(i >u j |Θ) =σ (xˆuij (Θ)) Здесь ˆ xuij — «встроенная» модель, которая отслеживает связь между u, i и j. Например, - матричное разложение - модель kNN
  • 35. BPR-Opt Предположим, наконец, априорное распределение параметров: p(Θ) = N(0,ΣΘ) Тогда весь алгоритм: BPR −Opt := ln p Θ|>u ( ) = ln p >u ( |Θ) p(Θ) = ln σ ˆ xuij ( (Θ)) p(Θ) Π (u,i, j )∈Ds Σ σ ˆ xuij ( (Θ))+ ln p(Θ) = ln (u,i, j )∈Ds Σ σ ˆ xuij ( (Θ))−λΘ Θ 2 = ln (u,i, j )∈Ds
  • 36. LearnBPR 1. Инициализируем параметры Θ 2. Пока не достигнута сходимость: 1. Выберем пример из Ds Θ←Θ+α exp(− ˆ xuij ) 1+ exp(− ˆ xuij ) 3. Вернем финальные параметры ⋅ ∂ ∂Θ ˆ xuij +λΘΘ & ) ++ * ((' 2.
  • 37. Еще раз о модели рейтинга Распишем ˆ xuij = ˆ xui − ˆ xuj В случае разложения матриц kΣ ˆ xui = wu, hi = wuf hif f =1 Тогда производные распишутся как ∂ˆ xuij ∂θ = (hif − hjf ) wuf −wuf 0 если θ = wuf если θ = hif если θ = hjf иначе
  • 38. If you like this lecture you will like these books
  • 39. If you like this lecture you will probably like http://www.4ducks.ru/pages/itmo-rs-2014.html
  • 40. Удачи! Андрей Данильченко группа разработки рекомендательных систем, Яндекс danilchenko@yandex-team.ru http://www.4ducks.ru/itmo-ml-course-recsys-part-2.html