24년 5월 5주차 그래프 오마카세
Co-Modality Graph Contrastive Learning for Imbalanced Node Classification
NIPS 2022
배지훈
Keywords
Graph Contrastive Learning (GCL), Co-Modality Graph Contrastive Learning, Inter modality GCL
- 비라벨 데이터로부터 생성된 인스턴스 쌍들을 대조하여더 나은 표현학습 모델을 훈련시키기 위한 목적의 대조 학습 (Contrastive learning) 방법들은 널리 잘 알려진 방법입니다. 꽤 최근 시점으로부터 그래프 도메인에서의 대조 학습 (GCL) 적용 연구들과 그 잠재성을 조사하는 연구들이 늘어나고 있습니다.
- 일반적으로 그래프 대조 학습은 그래프 증강 방법 (e.g. node removal, edge perturbation, feature masking)으로부터 생성된 positive & negative 대조 샘플들을 기반으로 모델을 최적화하여 이러한 샘플 쌍들을 구별하는 방식으로 대조 학습을 진행합니다.
- 하지만 여전히 정제된 벤치마크 데이터셋과 달리, 비정제된 데이터셋에서 기존 GCL 모델의 직접적인 적용에는 한계점이 존재합니다.
- 일관된 좋은 성능을 보장할 수 없다.
- 대부분 비정제 데이터셋은 불균형 클래스 분포가 존재한다.
- 이러한 불균형은 기존 그래프 신경망(GNN) 모델에 상당한 문제를 제기하여 편향된 예측과 소수 클래스의 성능 저하로 이어집니다. 다음을 해결하기 위한 방법론으로, 기존 컴퓨터비전 및 NLP 도메인에서 Cross-modality constrastive learning 방법을 차용하여 그래프 노드 임베딩에 대응하는 컨텐츠 임베딩 (e.g. 텍스트, 이미지 임베딩)의 대조 쌍을 생성합니다. 그리고 GNN & 컨텐츠 인코더를 동시에 학습시켰을 때 효과적으로 Positive 샘플 간의 유사성을 최대화하고 Negative 간의 유사성을 최소화하는 Co-Modality Graph Constrastive Learning (CM-GCL)을 제안합니다.
- 또한 클래스 불균형 문제로부터 발견되기 어려운 소수 샘플들까지 모두 학습에 포함시키기 위해, 다음 임베딩 인코더들에 Network pruning을 확장시키어 균형잡힌 노드 표현정보를 학습합니다.
- 구체적으로 소수 샘플들에 할당된 절대값 가중치를 기반으로 중요도를 랭크하고 특정 임계값 이하의 가중치를 제거시키는 반복적인 magnitude pruning 방법을 차용하며, 이로부터 소수 샘플들의 빈도수를 증가시키어 학습이 집중되어 진행될 수 있으며 불균형 문제를 크게 완화시킬 수 있습니다.
- Inter- & Intra modality 의 모든 GCL 경우를 고려합니다. Fig 1을 통해서 알 수 있듯이 전자는 Pruning되어진 소수 샘플들에 대한 대조 학습 방법, 후자는 샘플링 전 후의 임베딩들이 사영 공간에서 유사하게 유지될 수 있도록 조정해주는 방법으로 제안됩니다.
- 전체 GCL 학습의 방향성을 조정하는 데 Inter-&Intra modality GCN의 다른 가중치를 부여한 Loss들을 최적화 합니다.
- Co-modality GCL 이후에 얻어진 그래프 & 컨텐츠 인코더 (f*_T,G)를 파인튜닝하여 multi-step protocol 기반 클래스 분류 성능을 평가합니다. 클래스 불균형 문제를 해결하기 위해 동적 Cross-Entropy Loss로써 쉽게 분류될 수 있는 노드들에 낮은 가중치를 주어 더 어려운 노드들에 모델이 빠르게 집중될 수 있도록 하는 Focal Loss를 도입합니다.
- 메뉴얼한 그래프 증강기법의 비효율성 및 클래스 불균형 문제를 모두 해결하기 위하여 기존 Network pruning을 확장시킨 그래프 외 이미지, 텍스트의 다른 모달리티 인코더를 동시에 학습하여 균형잡힌 그래프 대조 학습을 가능케하는 방법을 제안한 논문이었다고 생각합니다.
- 그리고 해당 인코더 파인튜닝을 통해 실제 불균형 데이터셋의 하위 문제들의 노드 분류 작업에 적용될 수 있는 GCL 모델을 구축하였습니다.
- 차후 제안 방법을 Semi-supervised 혹은 Transfer Learning과 통합할 수 있는 방법론을 탐구하는 데 좋은 지침이 될 수 있을 거라 생각합니다.
[Contact Info]
Gmail : jhbae1184@akane.waseda.jp
Twitter (X): @jhbae1184
Engineering section 2
정이태
How we built Text-to-SQL at Pinterest
How we built Text-to-SQL at Pinterest
RAG 의 Retrieval 과정 중 ‘무슨 데이터’를 불러오는지를 담당하는 Query. Query를 활용해 구축되어 있는 knowledge base에서 적절한 데이터를 가져오는지가 중요합니다.
만일, 유저의 질의가 분석형 쿼리라면 어떻게 될까요? 질의 내 분석 의도를 파악하고 분석 Query로 변환하여 DB에 질의하는 과정에서 고려할 요소들이 굉장히 많습니다. 데이터 웨어하우스 내 각각 테이블들의 스키마들을 모두 대조하여 살펴보는 것만 해도 굉장한 비용이 발생할것으로 생각되는데요.
뿐만아니라, 여러 요소들이 개입하여 유저에게 관련 값을 전달한다는것은 난이도가 높은 과업이라 할 수 있습니다. 과연 이 과정들이 어떻게 진행될까요?
이번주차에서는 핀터레스트에서 Text2SQL를 위해 어떤 시도를 했는지에 대해 알아봅니다. RAG 구축하실때, SQL형태로 어떻게 변환하면 좋을지 고민하고 계셨던 분들에게 베이스라인 설계시 도움이 될 자료라고 생각하네요.
끝으로는 Text2Cypher를 위한 자료들을 레퍼런스로 남겨둘테니, SQL & NoSQL 모두 구축이 필요하신 상황이시라면 둘 다 참고하시면 좋을 것 같습니다.
Baseline
기존 방식은
총 3개의 구조가 SQL를 생성하기 위한 요소로 활용됩니다.
- Question, 유저의 질문
- Table, 테이블 이름 , 테이블 개요 , 컬럼 이름 , 컬럼 개요
- SQL Dialect , SQL 를 검색하는 SQL dialect(mysql, oracle , …)
여기에서 두번째 요소인 Table를 fetching 할 때 주의할 점이 두 가지 있습니다.
Low-cardinality columns
- SQL 입력문과 실제 유저가 질의하는 요소가 불일치할 경우입니다. 예를 들어, “iphone을 사용하는 유저들이 하루간 사용한 평균 데이터량” 을 질의한 상황을 가정해보겠습니다. SQL 문에서는 where = ‘iphone’ 이라는 구절이 필요하지만, 내부에 iphone 이 IPHONE 혹은 Iphone 등 동일한 단어지만, 철자가 다른 경우가 있습니다. 이를 LLM이 오인해 잘못 가져올 경우를 방지하기위해, 선정 기준으로 cardinality 를 활용합니다.
Context window limit
- LLM에는 token 제한량이 있기때문에, 적절한 정보를 선별하여 맥락으로 제공하는게 중요합니다. 데이터 웨어하우스마다 관리하고 있는 테이블 크기가 굉장히 클 것이라는 것을 짐작할 수 있기때문에, 이를 선별해 중요한 테이블을 가져오기 위한 작업들이 필요합니다.
- Reduced
- 특정 요소 만을 테이블 스키마로 가져옵니다. 전체 요소들 중 핵심이 될만한 특정 요소들만을 선정해 가져오는 방식입니다.
- Column pruning
- metadata store의 각 table마다 tagging 하여, 이를 포함 혹은 제외 하는 기준으로 활용합니다. tag에 기반해 table을 가져오는 방식입니다.
이렇게 3가지 요소들을 활용해 주입되는 프롬프트는 다음 그림과 같이 구성됩니다.
- dialect 를 입력해줌으로써, Text2SQL의 생성할 SQL을 명확히 지시합니다.
- metadata 로부터 가져온 table schema를 입력합니다.
- 질의 생성을 위한 starting point 혹은 레퍼런스를 입력합니다.
- 답변시 유의할 점을 입력합니다.
- 기대하는 답변 형태를 제시합니다.
Lessons learned
Spider 데이터셋을 사용하여 기존 문헌과 비교하여 시스템의 성능을 확인했으며, 산업계에서 발생하는 문제보다 문헌에서 정의한 문제 및 해결방식이 단순한 것으로 나타났습니다. 시스템이 배포된 후 시스템과 사용자의 익숙함이 향상됨에 따라 처음 SQL 생성의 승인률이 20%에서 40% 이상으로 증가했습니다. 대부분의 SQL 쿼리는 여전히 LLM에게 효율적으로 인지하기 위해 여러 번의 반복을 필요로 했습니다. 유저가 직접 Iterative Experimental 방식을 차용하여 가장 정확한 결과를 제공할 것이지만, 실제 데이터에서는 AI를 사용하여 SQL 쿼리를 작성할 때 작업 완료 속도가 35% 향상된 것으로 나타났습니다.
Enhanced approach
- 개선 방식 : RAG 를 적용하여 테이블을 정교하게 선택하기.
- 유저 질의의도 중 테이블과 연관없는 의도가 있을 경우 이를 분별하여, 답변을 내놓거나 혹은 각 데이터 웨어하우스(데이터 사일로)에 있는 수많은 테이블들 중 필요한 테이블만 선별하는 작업이 필요합니다.
- 그 방식을 적용하기 위해 기존 방식과 크게 달라진 점은 Offline vector index creation 을 활용해 Table 과 Query(SQL)을 임베딩 한 뒤, 이를 기반으로 Vector store 에서 table 간 비교를 하여 Topk table을 가져온다는 점입니다.
- 작동 방식은 하기 그림과 같습니다.
- 온라인 / 오프라인 두 부분으로 나누어 작업을 진행합니다. 온라인에서는 실시간으로 발생하는 쿼리를 다루며, 오프라인에서는 온라인에서 발생한 데이터들과 SQL Query Logs를 보관 및 분석하여 정교한 쿼리 생성을 위해 배치작업을 합니다.
- 오프라인에서는 테이블 요약 및 이에 대한 기록 쿼리의 벡터 인덱스를 생성합니다.
- 사용자가 테이블을 지정하지 않으면 질문이 임베딩으로 변환되고 벡터 인덱스에 대해 유사성 검색을 수행하여 상위 N 개의 적합한 테이블을 추론합니다.
- 상위 N개의 테이블은 테이블 스키마 및 분석 질문과 함께 LLM이 가장 관련성이 높은 상위 K개의 테이블을 선택해서 프롬프트에 입력합니다.
- 상위 K 테이블은 유효성 검사 또는 변경을 위해 사용자에게 반환됩니다.
- 사용자가 확인한 테이블로 표준 Text-to-SQL 프로세스가 다시 시작됩니다.
Offline Vector Index Creation
오프라인 영역에서는 다음 두 가지 문서 타입을 임베딩하여 벡터 인덱싱합니다. 유저 질의 임베딩 값과 쿼리 요약 임베딩 값 및 테이블 요약 임베딩 값을 비교하여, 맥락을 풍부하게 만드는게 핵심입니다.
- 쿼리 요약
- 테이블 요약
테이블 요약
테이블 간 tiering 을 해주며 우선순위를 두는 작업에 주안점을 두고 있습니다. 다양한 테이블마다 tiering 을 하며 우선순위를 선정해주는 작업이 필요하지만, 이번 작업에서는 top-tier 테이블들만을 우선적으로 활용합니다. 이 테이블들을 선정해 요약하는 과정은 다음과 같습니다.
- 테이블 메타 데이터 보관소에서 테이블 스키마를 가져옵니다.
- 테이블을 활용해 최근 사용한 샘플 쿼리들을 수집합니다.
- 테이블 스키마와 함께 샘플 쿼리를 프롬프트에 주입합니다. 이때, LLM 토큰 용량을 고려한 context window 에 기반하여 주입됩니다.
- LLM에게 프롬프트를 주입하여 summary 를 생성합니다.
- 생성된 테이블 스키마와 요약 문자들을 vector store에 저장합니다.
Query Summarization
테이블 요약과 다르게, 쿼리를 활용하는 목적 그리고 활용한 테이블들을 포함해 쿼리를 활용한다는 관점에서 요약 값을 생성하고 이를 임베딩하여 vector store에 저장합니다.
추가로 NLP 임베딩 간 값 비교를 위해 open search 를 활용해 vector store 에 저장된 테이블 요약 , 쿼리 요약을 색인하여 가져옵니다. 가져온 값을 기반으로 LLM에게 데이터 사이언티스트 라는 expert instruction 과 함께 관련 있는 테이블을 선정하도록 task instruction 을 입력하여 Re-selection하는 과정을 거칩니다. 이를 통해 최종 선정된 Table 값이 LLM에게 온라인 작업의 최종 프롬프트로 입력되어, 답변 생성하는데 맥락으로 활용됩니다.
Lessons learned
- 평가를 통해 테이블 검색에 사용되는 임베딩 방법을 선택하고 임베딩에 가중치를 설정했습니다. 이 접근 방식을 통해 데이터 거버넌스(meta data store build) 노력을 통해 생성된 테이블 메타데이터가 전체 성능에 매우 중요하다는 것을 알 수 있었습니다. 임베딩에 테이블 문서가 없는 검색 적중률은 40%였지만 테이블 문서에 가중치를 부여하면 성능이 90%까지 선형적으로 증가했습니다.
레퍼런스
프롬프트 원문 & 코드
국내 사례
llama3를 활용하여 수행한 Graph Task
1.NER(Named-entity recognition), 개체명 인식 및 분별을 활용한 그래프 구조 만들기.
- 비정형 데이터(문서 텍스트)로부터 정보를 추출해 정보들간 연관성을 파악하는 일은 텍스트가 무슨 텍스트인지를 정의하고 그 텍스트들간 무슨 연관이 있는지를 파싱하고 맵핑해주어야 하기때문에 난이도가 높은 task 중 하나라고 할 수 있습니다.
- NER의 결과물인 데이터들간 연관성을 그래프로 간주하고 분석에 활용할 수 있는 관점이 존재합니다. 예를 들면, RDF(Resource Description Framework)와 같이 주어 서술어 목적어 형태로 구성이 되어 이를 RAG의 context 로 제공하는 관점같이 말이죠.
- 이를 위해선 NER을 수행하는 LLM이 필요합니다.
- https://towardsdatascience.com/relation-extraction-with-llama3-models-f8bc41858b9e
2.Text2cypher , 유저 질의를 Cypher query 형태로 만들기.
Query validation
- SQL dialect와 유사하게 GQL(Graph Query Language)도 여러 그래프 질의어가 있습니다. 하기 링크 논문은 그 중 SPARQL 을 기반으로 온톨로지 validation 하는 관점인 Ontology-based Query Check(OBQC)를 활용해 Text2SPARQL 개선하는 아이디어를 이야기합니다.
Metadata enhancement
- Graph schema summarize
- SQL table schema가 중요하듯 GQL도 graph schema가 중요합니다. 앞서, 중요한 테이블을 선정하기 위해 graph에서도 schema scan & ranking하는 방식이 존재합니다. SQL의 low cardinality와 유사하게 node property distinct value를 통해 이를 선정하고 분포를 계산하는 방식으로 그래프에서 상대적으로 중요한 스키마를 가져오는데요. 이 과정을 langchain에서 간단하게 함수 형태로 활용할 수 있습니다. 하기 링크는 이 함수에 대한 포스팅입니다.
- https://python.langchain.com/v0.1/docs/integrations/graphs/neo4j_cypher/#enhanced-schema-information
- 생태계 규모가 큰 SQL과는 다르게 생태계가 규모가 작은 Cypher 를 생성할 때 LLM의 환각현상이 많이 발생합니다. 이를, 개선하기 위해 finetuning이 필요한데요.finetuning에 필요한 Cypher 데이터 셋을 만드는 과정을 담은 포스팅입니다.