Pycon Korea 2020에서 들은 내용을 정리해 보았습니다.


Day 1: Elastic App Search 로 파이썬 애플리케이션에서 검색 기능 사용하기

  • 애플리케이션에서 필요한 검색 기능 에 대해 다룸
  • 식당 검색의 경우
    • 텍스트 검색 (음식점 이름)
    • 범위 검색 (메뉴 가격, 오픈 시간)
    • boolean 검색 (반려견 출입 가능 여부)
    • 스마트폰의 GPS 기능을 활용한 위치 검색 (내 위치에서 반경 1km 이내)
  • RDB와 Elastic의 차이
    • RDB: 데이터에서 인덱스 순서대로 원하는 결과를 찾음. 정렬하면 시간이 더 소요. SQL에 최대한 자세히 적어야 함
    • Elastic: TF-IDF 이용한 점수 기반의 full text 검색
      • json 쿼리
      • TF(Term Frequency): 찾는 검색어를 많이 포함할수록 도큐먼트의 정확도 높아짐
      • IDF(Inverse Document Frequency): 검색어가 전체 도큐먼트 사이에서 빈번할수록 도큐먼트의 정확도 낮아짐
      • 위치 검색 도 지원. 위치 검색에 관한 json key들이 있음
  • Elastic App Search
    • Enterprise Search의 한 종류 -> Elastic의 대부분은 무료로 사용할 수 있다는데, 이건 무료 아닌가?
    • ELK 스택에 추가로 App Search라는 엔진을 더 띄워야 함
    • 하나의 데이터셋 = 하나의 엔진
  • App Search 클라이언트는 pip로 설치

데모

  • GitHub 링크
  • 엔드포인트는 로컬은 localhost, 클라우드는 클라우드 엔드포인트 사용
  • Elastic Cloud: 무료로 14일 간 사용 가능. 3개의 Public Cloud사 선택 가능
    • 사이즈에 비례하는 요금
    • Enterprise Search 인스턴스 생성
  • 먼저 elastic이라는 슈퍼 계정의 비밀번호가 나옴. 이건 다시 제공되지 않기 때문에, 반드시 복사해 두어야 함!
    • 슈퍼 계정은 봉인하고, 적절한 권한의 다른 계정 사용 권장
  • App Search Engine 생성
    • 준비해 둔 dataset 사용 (게임들의 정보인 듯)
    • 언어 선택할 수 있는데, 한국어 선택해도 한국어 형태소 분석기가 적용되진 않음. Universal로 해도 됨
  • 코드
    • base endpoint에서 https://는 빼야 함
    • private api-key 필요
  • 데이터를 100개 레코드씩 slice하여 업로드 (총 4,000개 정도 됨)
    • 대시보드에서 schema가 자동으로 생성된 것을 확인할 수 있음. 레코드별로 데이터 삭제할 수도 있음
    • 기본적으로 모두 text 타입으로 들어가는데, 필요한 칼럼은 number로 변경
    • 스키마가 변경되면 데이터를 새로 삽입해야 함?

대시보드 기능

  • Query Tester
    • 검색 결과 테스트 창
    • 레코드별 score 를 확인할 수 있음. score별로 정렬됨
  • Relevance Tuning
    • 필드의 가중치 부여로 검색 순위 조정
    • 기존 score 기반 순위가 아닌, global sales(전세계 판매량)라는 칼럼 순으로 검색 순위를 조정할 수 있음
  • Synonyms
    • 기본적으로는 전방일치 검색만 가능
    • pikachu의 동의어를 pokemon으로 설정하면, pikachu로 검색할 경우 pokemon도 나옴
  • Curations
    • 특정 게임을 promotion 하고 싶을 때
    • 특정 게임은 재고가 없거나 해당 기업 이슈 등으로 인해 hide 하고 싶을 때
    • score가 1.0으로 낮은 레코드가 promotion으로 인해 가장 상위에 나옴
  • 이와 같이 서비스 운영에 필요한 여러 기능들을 제공함

기타

  • 사용자의 API 호출 기록 합산. 인기 검색어 등 확인 가능
  • Generate Preview
    • 결과 예시 화면 제공
    • skyscanner 같이 검색 결과와 정렬, 필터링 UI 제공
    • Download zip package 누르면, 해당 화면을 node.js로 작성된 코드로 확인할 수 있음



Day 1: 왕코보 코딩교육 삽질기


원칙 1. 내가 가르치고 싶은 정도가 아님, 그들에게 필요한 최소 단위를 생각

  • 이 정도는 알아야 하지 않을까? 라고 생각하지 쉬움
  • 예: from과 import의 차이
  • 입문자는 변수, 자료형(튜플까지 가지 않고 리스트, 딕셔너리만), 함수, 조건문, 반복문 이 5개만 알면 됨
    • 변수도 복잡하게 설명하지 않고, a라는 박스에 5를 넣는다 라는 식으로 설명
    • 그러나 꼭 짚어줘야 하는 건 설명 e.g. 변수명에 특수문자나 한글은 쓰지 않는 것, ===의 차이
  • 이 선을 잘 지켜야 함
    • 아예 모르면 뭘로 검색해야 할지도 모름
    • 검색해서 알 수 있을 정도로만 설명
  • 연습할 때는 쉬운 개념으로
    • 소수 판별하기 말고, 홀짝 판별하기

원칙 2. 모르는 말을 쓰지 않기. 비유를 많이 들기

  • 비개발자에게 API를 설명해야 할 경우
    • 튜터 면접 단골 질문이기도 함
    • Application Programming Interface, 서버와 클라이언트의 연결, … 이렇게 설명하면 머리 아픔
  • 비유를 할 경우, 모르는 개념을 언급하지 않기! 모르는 단어가 나오면 계속 물어보는 사람은 없음. 그냥 넘어가는 경우가 많음
  • 대안: 은행(서버) 창구(API)에서 고객(Client)이 거래를 하기 위해 필요한 서류, 규칙 등이 있다!

원칙 3. 계속 이해를 못하면 설명을 그만하라

  • Flask를 설명할 경우, DB-Server의 개념으로 설명 -> 이해 안 되면 다르게 설명 -> 그래도 이해가 안 되면 다르게 설명 -> … -> 끝없는 굴레
  • 자전거 타기와 같이, 계속 개념적인 이해를 시키기보단 눈과 손으로 이해해야 함. 그러다 보면 머리도 이해하게 됨
  • 그래도 나는 원리가 중요해! 라고 생각하며, 세세하게 이해하려고 하는 사람이 있음
    • 단호하게 거절. 익숙해지면 까 봐야 함

원칙 4. 준비는 그만. 얼른 판으로 나가자

  • 너무 많이 준비하기보다, 사이드 프로젝트를 해야 실력이 비약적으로 향상됨
  • 배운 것을 적용할 수 있도록, 내 프로젝트를 만들도록 유도. 다만 큰 문제를 겪고 있을 때만(e.g. 인코딩 문제) 도와 줌



Day 2: 자연어처리 초보자의 BERT 도전기

  • 슬라이드 링크
  • 블록체인 분산 컴퓨팅 회사인 Common Computer 소속
  • BERT (Bidirectional Encoder Representaions from Transformers)
    • 문장 sequence를 입력받으면 텍스트의 특징을 추출하는 모델. 2018년 Google에서 공개
    • Mask Language Model: 입력 문장에 빈 칸을 뚫어 예측
    • NSP: 원래 문장과 랜덤 문장 중 다음 문장이 어떤 것인지 예측
  • 기존 NLP 모델 과의 차이점
    • Word2Vec은 맥락과 관계 없이 단어 벡터화
    • BERT는 문장의 맥락을 고려 하여, 문장을 통째로 벡터화
  • BERT로 Question Answering
    • 입력 문장 중 어느 지점에 답이 있는지 - 시작 지점이 될 확률이 높은 부분과 끝 지점이 될 확률이 높은 부분을 찾아냄
  • KorQuAD 2.0
    • 한국어 Question Answering Dataset
    • 대기업에서 리더보드 상위 차지하고 있음
  • KorQuAD 2.1
    • 한글 Wiki에서 답이 들어 있는 부분을 찾아내는 Task
  • Pre-Training과 Fine-Tuning
    • Pre-Training: 많은 라벨링되어 있지 않은 데이터 학습
    • Fine-Tuning: 주어진 Task에 맞게 모델 수정. Question Answering에 맞게 수정 필요
  • Python으로 처리하는 것의 장점
    • 사용 가능한 라이브러리 많음
    • 간결하고 이해하기 쉬운 코드. Python 500줄이면 C++은 1000줄 넘기도 함
  • BERT 모델 학습에 이용한 자료
    1. 페이스북 그룹 TensorFlow KR 글
    2. Huggingface Transformers: Pytorch + Tensorflow 환경에서 BERT 모델을 돌릴 수 있는 라이브러리
    3. SQuAD 데이터셋(40MB) 대신 KorQuAD 데이터(7GB) 넣기
      • 영어에 비해 한글 데이터의 사이즈 및 메모리 사용량이 훨씬 큼
    4. Redis DB로 파이프라인 개발
      • 학습에 필요한 만큼의 데이터만 불러오고, 나머지는 Python의 가비지 콜렉터에 맡김 + 256개 CPI로 멀티 프로세싱 + Profiler로 병목점 확인
      • pandas는 속도가 느려 native 함수(open)로 한 줄씩 읽음
  • 현재까지는 모델 고도화보다는 엔지니어링(전처리) 과정이 훨씬 많았음
  • GPT-3
    • 사람이 말하듯이 자연스러운 텍스트 생성
    • 텍스트를 요약한 표 생성
    • 모델의 사이즈가 다른 모델이 비해 훨씬 큼. 개인 GPU로는 학습조차 어려움
    • 대신 학습 완료하면 어떤 Task든 Fine-Tuning하지 않아도 해 냄
  • GPT-3를 이용한 한국어 번역이 목표
  • Ainize
    • Bert API 실행해 볼 수 있음. 웹에서 바로 요청도 가능
    • KoNLPy API도 있음. GPU 옵션도 있는 듯



Day 2: TDD와 Flipped Classroom을 활용한 파이썬 교육

대학에 와서 프로그래밍 관련 수업을 처음 듣는 학부 1학년 학생들, 그 중에서도 공과대학이 아닌 학생만 들을 수 있는 분반에서 파이썬을 재밌고 효과적으로 가르치기 위해 시도했던 교수법들을 소개합니다. Flipped Classroom을 사용해서 파이썬 이론 교육을 강화하고 TDD를 접목 시켜서 파이썬 실습 교육을 진행했습니다. 두 가지 개념이 무엇이고, 어떻게 교육에 적용시켜서 어떠한 결과가 나왔는지에 대해 설명합니다.

  • 슬라이드 링크
  • 서울대학교 컴퓨터공학부 대학원 석박사통합과정으로, 학부 수업 진행 방식 에 관한 시도
    • 프로그래밍을 처음 배우는 학부 1학년, 비공대생 분반 학생 대상
  • 패시브, 액티브한 수업 활동
    • 패시브: 강의 듣기, 책 읽어오기 등
    • 액티브: 그룹 토론, 실습, 가르치기
  • Flipped Classroom: 강의에 패시브와 액티브 활동을 바뀐 것.
    • 보통 수업: 강의 시간에 이론 교육(패시브), 개인 시간에 과제(액티브)
    • Flipped Classroom: 강의 시간에 토론 등의 활동(액티브), 개인 시간에 이론 교육(패시브)하여 수업 시간의 효율을 극대화함
    • 개인적으로 프로그래밍 강의는 이론 강의와 달리 수업 시간에 교수님이 개념을 설명하는 것이 개인적으로 학습하는 것보다 효율이 떨어진다고 생각. 매우 좋은 접근 방법인 듯
  • 강의 전에 수업 내용 영상 시청(패시브) -> 강의 시작 직후 영상에 대한 퀴즈(액티브) -> 강의 시간에는 퀴즈 풀이, 디스커션, 코딩 실습 -> 이후 텀 프로젝트
    • 자유롭게 질문하는 분위기가 형성되고, 직접 코딩하며 시행착오를 겪을 수 있음
  • 예: 강의 내용이 파이썬 for문일 경우
    • 퀴즈: 다음 코드에서 for문의 반복 시행 횟수를 구하시오
    • 디스커션: for문을 이용하여 정수 list에서 가장 큰 수를 찾는 알고리즘을 구현하려면?
    • 1학년 때부터 알고리즘에 대한 기초를 다지는 좋은 기회가 될 듯
  • TDD (Test-Driven Development)
    • 스스로 테스트하며 학습하는 것
    • Unit Test 후 구현, 디버깅, 리팩토링 통해 성공할 때까지 직접 구현
    • 스스로 해결할 수 없는 경우에만 조교가 도와줌
  • TDD 실습의 성과
    • 정성적 성과: 학생들이 테스트 케이스를 보면서 의도를 가지고 코딩하고, 의도에서 무엇이 누락되었는지를 피드백받음
    • 정량적 성과: 모든 학생이 필수 문제 통과!! 즉 실습을 따라오지 못한 학생이 0명
  • 강의평가: 원점수 공개할 수 없기 때문에, 평균 대비 몇 시그마인지만 제공
    • 해당 수업은 컴공 과목 평균 대비 모든 평가 항목에서 +0.5 표준편차(학교 전체 대비 +0.3 표준편차). 원점수로는 만점에 가까웠음
    • 프로그래밍 수업이 많은 컴공 과목의 특성상, 이 방법의 효과가 더 컸다고 할 수 있음
  • 결론
    • 액티브한 교육 활동의 비중을 늘리자
    • 코딩 실습에는 테스트를 제공하자 (코딩 테스트처럼)