2021년 2월 26일 금요일

AITech 학습정리-[Day 25] GNN 기초 & GNN 심화

 

===============================

학습내용

[Graph 9강] 그래프 신경망이란 무엇일까? (기본)




정점 표현 학습의 목적은 이것.

전 강의에선 변환식 임베딩 방법을 썼지만 한계가 있어서 귀납식 방법을 쓴다. 즉 벡터를 넣고 벡터를 반환받는게 아니라 모델 자체(인코더)를 반환 받는다.

대표적 귀납식 임베딩 방법인 그래프 신경망(Graph Neural Network)를 사용할 것.


그래프 신경망 기본

그래프의 인접행렬을 A라고 하면 A의 크기는 |V| *|V| 가 된다.

각 정점 u의 속성(Attribute) 벡터를 Xu 라고 하고, 정점 속성 벡터 Xu는 m차원 벡터고, m은 속성의 수로 하자.


그럼 각 정점들을 임베딩 했으니 각 층에 넣어서 학습할 수 있다. 이웃들을 다같이 입력값으로 넣어 계산하는 방식이라 구하고자 하는 대상 정점에 따라 구조가 달라질 수 있다.


각 층에 대한 학습 변수는 같다. 즉 Weight가 같다는 말.

그럼 입력값이 매번 달라지는데 어떻게 입력을 하냐? 그래서 이웃 정보들의 평균을 계산하고 신경망에 넣는다.



그래서 위 식처럼 hidden vector를 정의한다. W와 B는 각 층 k마다 다르고, 학습되는 환경변수다. Loss function도 임베딩에서의 공간유사도와 그래프에서의 유사도가 일치하게 끔 학습하도록 정의한다. 원래 목적이 그거였으니까.



또 후속과제라고 목적 자체가 해당 정점에 대해 파악하는 것도 있을 수 있다. 이런 경우는 후속 과제(Downstream Task)의 손실함수를 이용한 종단종(End-to-End) 학습도 가능하다고 한다. 이 목적에 맞춰서 loss function을 달리 정의하는 듯.

 



보면 왠지 CNN 과 비슷하게 생겼는데 실습할 때도 비슷한 방식으로 넣더라. 이렇게 End-to-End로 학습하는게 성능도 잘 나온다 하더라.

이렇게 학습된 인코더를 통해, 학습되지 않은 다른 정점의 임베딩도 얻을 수 있다. 즉 이 인코더를 통과하기만 한다면 그 정점이 주변과 어떤 관계가 있는지 정보를 가지고 있는 공간벡터로 변환이 가능하다는 것이다. 이게 애초 목적이었으니까.



이런 귀납식 방법을 썼기 때문에, 변환식이 못한 것을 해낸다.



그래프 신경망 변형

위에서 한건 그래프 신경망의 기본 형태였고, 이 신경망을 다양하게 개조해서 사용한다고 한다. 다양한 형태의 집계 함수를 사용한다고 한다.


그래프 합성곱 신경망(Graph Convolution Network, GCN)의 집계 함수. Bk를 Wk에 하나로 퉁쳤다.


Graph SAGE의 집계 함수. GCN처럼 Bk를 Wk로 퉁치는건 걱정이 되었는지 concat으로 그냥 벡터의 길이를 늘려 추가하는 방식으로 했다. AGG 함수로 약간 일반화 시켜 목적이나 원하는 함수를 넣을 수 있게 한 것 같다.



합성곱 신경망(CNN)과 비교



둘다 이웃의 것을 사용하기 때문에 비슷하다고 볼 수 있으므로 그냥 기존에 만든 CNN에 넣으면 되는거 아니냐 라고 생각할 수 있다. 하지만 입력되는 수가 다르기도 하고, 제일 큰 이유는 바로 옆에 있는 이웃과 정보가 연관되어 있지 않기 때문에 사용할 수 없다.




실습

https://colab.research.google.com/drive/1_HT5Dy7YQ4b2601GhLC4PzlN2TxdUbks?usp=sharing


[Graph 10강] 그래프 신경망이란 무엇일까? (심화)


그래프 신경망에서의 어텐션



위에서 한 것도 한계가 있다. 각 이웃들마다 가중치를 부여하지 않았기 때문에 제성능을 잴 수 없단 것.


그래서 각 이웃들 마다도 가중치를 적용한다. 진짜 가중치 엄청 좋아한다. 각 이웃들마다 어디에 집중할지 다른 가중치를 부여하기 때문에 어텐션이라고 부르는 것 같다.

이 가중치를 얼마나 부여할지도 학습한다. 그래서 학습변수가 W, aT 가 된다.

그래프 신경망은 언제 사용되는가

1) 개별 정점의 임베딩을 얻을 때 2) 군집 구조로 묶어줄 때(군집을 찾는데) 3) 이것들을 군집 내에서 합산할 때 즉 합산하는 방법 자체 총 3종류의 곳에서 그래프 신경망이 활용되고 있다.


여러개를 동시에 학습할 수 있다고 한다. 행렬 곱 특성 때문인가? 가능하다는데 뭐

어쨋든 이렇게 하면 성능이 좀더 잘 나온다.


그래프 표현 학습과 그래프 풀링


그래프 자체를 임베딩을 하는 것.

그래프 풀링(Graph Pooling)이란 정점 임베딩들로부터 그래프 임베딩을 얻는 과정입니다

평균 등 단순한 방법보다 그래프의 구조를 고려한 방법을 사용할 경우 그래프 분류 등의 후속 과제에서 더 높은 성능을 얻는 것으로 알려져 있습니다.

아래 그림의 미분가능한 풀링(Differentiable Pooling, DiffPool)은 군집 구조를 활용 임베딩을 계층적으로 집계합니다.


화학분자 구조모형 분석 같이 그래프 자체가 의미가 있을 때 하는 것 같다.


지나친 획일화 문제



레이어 크기를 늘릴수록 다른것들끼리 유사하다고 판단해서 구별이 안된다. 이게 무슨 말이냐면 레이어를 늘리면 간선이 저 멀리까지 가서 해당 정점이 아주 멀리있는 다른 정점들까지 고려해서 파악이 되다보니 서로 다른게 아니라고 학습이 되는거. 그래서 레이어가 커질수록 서로 관련이 깊어지고, 그러다보니 임베딩이 비슷해진다.


실제로 그래프 그려보면 레이어가 많을 수록 성능이 떨어진다.


그래서 APPNP의 경우 0번째 레이어를 제외하고 모든 층의 임베딩을 함께 사용한다고 한다. 단순하게 집계해서 어떻게 처리하는것 같다. 몰라 여기 이해 안가니까 나중에 찾아봐야 한다.


그래서 저 방법을 쓰니까 레이서 수가 많아도 상관없더라. 라는 결론이 나온다.


그래프 데이터의 증강


임의 보행을 먼저 수행해서 유사도가 높은 정점 간에 간선을 추가해서 데이터 증강을 한다고 한다. 그러니가 원래 입력 그래프에서도 데이터가 누락되거나 부정확한 간선이 있을 수 있기 때문에 얘는 분명이 간선이 있을텐데 없다면 그걸 이어주고 학습하는 것이다. 그럼 더 정확한 학습이 된다는 생각. 실제로 개선된다고 한다.


실습

https://colab.research.google.com/drive/1vyWTB9gnrWlch3jgmq_4K4RDWhmt1jQr?usp=sharing



================================

피어세션

end to end는 노드 임베딩보다는 목적이 원래 그 노드에 대한 classification 하는 거니까 그거에 맞춰서 한 거인듯.

결합한다. 그래서 이름이 GraphSAGE라는 라이브러리 이름을 가지는 듯.

GNN 여기가 설명 더 쉽게 하는 것 같다: https://www.youtube.com/watch?t=2229&v=NSjpECvEf0Y&feature=youtu.be



SK는 양식주는데 맞춰서 하면 된다. 코테가 1문제가 진짜 어려웠다.

CNC는 인성 보는 듯. 햇으면 뭐.. 적으면 되겠지.


면접볼때 약간 보수적인 기업들 (은행 등 금융권) 같은 경우는 정장을 입어야 하고 IT나 다른 개방적인 곳은 안해도 됨. 아얘 금지하는 곳도 있다.



===========================

마스터 세션

지금은 추천시스템 수요가 많이 없지만 그만큼 공급은 더 없어서 취업에 유리할 거라고 생각.. 사실 잘 모르겠다.

데이터셋들

https://ogb.stanford.edu/

http://web.stanford.edu/class/cs224w/

그 외 kaggle 등에도 추천시스템 하면 관련 대회 많이 나온다.


Networks, Crowds, and Markets



추천논문 ( 단하나만 한다면.ㅏ.)

https://arxiv.org/abs/1303.4402



=================================

후기

공부하기가 싫어짐.

근데 내 길은 추천 시스템이 될 것 같다. 일단 주말이니까 좀 놀다가 하고싶을때 하자.


2021년 2월 25일 목요일

AITech 학습정리-[Day 24] 정점 표현 & 추천시스템 (심화)

 

=============================================

학습내용


[Graph 7강] 그래프의 정점을 어떻게 벡터로 표현할까?


정점 표현 학습


이전까지는 그래프 라이브러리를 활용해서 그래프 자체를 입력값으로 넣어 학습시켰지만, 원래 벡터 형태를 가정하고 만든 모델들이 있으니까, 그래프 즉 그래프의 정점들을 벡터형태로 임베딩하면 벡터 형태의 데이터로 다른 여러 훌륭한 모델들을 사용할 수 있다.

기계학습 도구들이 한가지 예시입니다
대부분 분류기(로지스틱 회귀분석, 다층 퍼셉트론 등) 그리고
군집 분석 알고리즘(K-Means, DBSCAN 등)은
벡터 형태로 표현된 사례(Instance)들을 입력으로 받습니다
그래프의 정점들을 벡터 형태로 표현할 수 있다면,
위의 예시와 같은 대표적인 도구들 뿐 아니라, 최신의 기계 학습도구들을
정점 분류(Node Classification), 군집 분석(Community Detection) 등에
활용할 수 있습니다


그래프를 통해 주변의 관계, 군집 등을 표현한 것 처럼 벡터로 나타낸다면 이런 관게를 좌표상에 보존하는 것을 목표로 한다.


그래서 벡터간의 유사도를 나타내기 위해 내적을 사용한다. 이건 전에 했던 영화 추천 시스템과 비슷하다.

그럼 해야할 일은 정해졌다.

1) 그래프에서의 정점 유사도를 정의하고

2) 정의한 유사도를 보존하도록 정점 임베딩을 학습한다.


그래서 정점 유사도를 어떻게 정의할 것인지, 몇가지 접근법을 알아본다.

여기서 우리가 하고 있는건, 그래프를 입력으로 넣으면 벡터를 출력으로 내주는 learning model를 만들고 싶다는거다. 그래서 유사도 정의에 따라 각각 다르게 loss function을 정의하는 등의 행동을 할거다. 학습의 결과로 정점의 임베딩 자체를 얻는 변환식 방법들이다.


인접성 기반 접근법


말 그대로 그냥 바로 연결되어 있으면 유사하다고 하고, 아니면 아니다 라고 정의하는 것이다. 

그래서 이 정의에 따라 Loss function을 고려한다.



근데 이렇게 유사도를 정의하면 당연히 문제가 생긴다. 거리가 2~3 인 경우에도 사실은 어느정도 유사한 특징인데 그걸 싸그리 다 무시하고, 그러기 때문에 같은 군집에 있어도 유사도가 0이 된다.

그래서 이를 보완하는 다른 방법들을 생각해본다.


거리/경로/중첩 기반 접근법


http://snap.stanford.edu/proj/embeddings-www/




거리 k가 추가됐으니까 그냥 인접성 기반 접근법에서 나온 A에 k만 추가한 형식임을 알 수 있다. k승 곱해주는데 그 중간 경로로 가면 가능한 개수가 늘어나니까 곱해주는거 있잖아 그 그래프에서. 그거 말하는 거라는데. 까먹어서 그런지 이해가 안간다..




중첩도 중첩된 정도에 맞춰 loss function이 달라졌다.


친구 수백명 중의 1명이라면 별로 안중요한 관계일 수 있지만, 친구 2명중 1명 이라면 매우 중요한 관계일 확률이 높다. 이를 반영하기 위해 비율로 계산한 거다.


임의보행 기반 접근법


아 그냥 위에 방법들 다 필요 없고 웹서핑 했던 것처럼 임의의 확률로 그냥 다 걷게 하자. 가 임의보행 기반 접근법. 그래서 시작 정점 주변의 지역적 정보와 그래프 전역 정보를 모두 고려할 수 있다.



로그에 덧셈이니까 확률 곱으로 볼 수 있을듯.

그래서 이렇게 임의 보행 방법을 사용할 수 있는데, 여기에서도 방법에 따라 DeepWalk 와 Node2Vec이 구분된다.

DeepWalk는 위에서 한 기본적인 임의보행 방법이고, 즉 현재 정점의 이웃 중 하나를 균일한 확률로 선택하는 이동과정을 반복하는 거고

Node2Vec은 직전에 갔던 거리에 따라 차등적인 확률을 부여하는 방법을 쓴다.




위 그림이 Node2Vec으로 임베딩을 한 뒤에 K-means로 군집 분석을 수행한 건데, 부여하는 확률에 따라 다른 기능으로 작동하는 걸 볼 수 있다.


근데 위에서 눈치챘을수도 있지만 loss function이 v의 제곱인 시간복잡도를 가진다. 만약 사람 만명만 넣어도 게임 끝남.

그래서 몇 개의 정점 샘플만 뽑아서 비교하고, 근사식을 사용한다.




변환식 정점 표현 학습의 한계


지금까지 위에서 한건 변환식(Transductive) 방법. 이게 뭐냐면 학습의 결과로 정점의 임베디 자체를 내놓기 때문에 생기는 한계들이 있다.

1) 학습이 진행된 이후에 추가된 정점에 대해서는 임베딩을 얻을 수 없습니다 2) 모든 정점에 대한 임베딩을 미리 계산하여 저장해두어야 합니다 3) 정점이 속성(Attribute) 정보를 가진 경우에 이를 활용할 수 없습니다 

그래서 출력으로 결과 임베딩이 아니라 모델(인코더) 자체를 내놓는 귀납식(Inductive) 방법이 있는데 대표적인게 그래프 신경망(Graph Neural Network)다.






실습


https://colab.research.google.com/drive/1F_bfebRlyKFZTw8acxNYodT1HX1M6MC9?usp=sharing



[Graph 8강] 그래프를 추천시스템에 어떻게 활용할까? (심화)



내용 기반 추천 시스템, 협업 필터링, 추천시스템의 평가.. 앞에서 했던것들


넷플릭스 챌린지라고 추천 예측하는거 했었는데, 이걸로 많은 사람들이 달려들어서 추천시스템이 많이 발전했고 여기서 만들어진게 아직도 쓰이고 있다.


잠재 인수 모형




잠재 인수 모형(Latent Factor Model) = JUV decomposition = SVD(와 유사)

사용자와 상품을 벡터로 표현한다. 이것 조차 학습시켜서 잠재 인수가 나온다.



이게 무슨 말이냐면 행을 유저로 놓고 열을 영화로 놓은 원래 참 데이터가 있을 텐데 이 행렬은 유저와 그 유저에 대한 잠재벡터, 영화와 그 영화에 대한 잠재벡터의 행렬 곱으로 나눠서 볼 수 있다. 결국 이 유저행렬, 영화행렬을 다 채우면, 자연스럽게 원래 있던 참 데이터의 예측값이 나올 수 있게 되는 것이다. 그리고 참 데이터와 이렇게 예측해서 만든 행렬이 있으니 학습이 가능해서 학습하는 것이다.


그래서 이게 기본 loss function 이다.




그래서 뭐 수가 너무 많으니까 그냥 경사하강법(GD) 대신 확률적 경사하강법(SGD) 쓰고.. 이전 그냥 일반 딥러닝이랑 비슷하다.


그래서 여기까지 고려해서 계산했었는데 목표 오차가 안나와서 더 파고들음.


고급 잠재 인수 모형


위에서 한 잠재 인수 모형에서 좀 더 할거 없나 찾아보는 모습이다.



기존엔 p와 q를 통해 평점 자체를 예측하려고 했다면, 지금은 사용자 편향과 상품 편향을 제외하고 그 차이만을 pq 내적을 통해 근사하려고 하는것.

전체 점수 평균과 사용자, 상품의 편향까지 세세하게 고려해서 순수 변수들만 예측하게 하게끔 하는 것.



(확률적) 경사하강법을 통해 손실 함수를 최소화하는 잠재 인수와 편향을 찾아냅니다



평점이 시간에 따라 달라지는 것도 고려한다.

근데 이렇게 해도 안되니까 결국 그냥 거의 300개 모델을 앙상블해서 이겼단다.




실습

https://colab.research.google.com/drive/14A8kPOi0edefHg6HrF3DequiyqkYMD81?usp=sharing




=========================================

과제 / 퀴즈

https://colab.research.google.com/drive/10j2KFOYboKZEk4aFe8Y8remv7vQXgjT6?usp=sharing

행렬 곱셈에서 메소드 조심하자.


==========================================

피어세션

수업 복습하고 기업관련 얘기했음.


====================================

후기

놀고 싶은 마음이 커진다..