Machine learning

    [챗봇] faiss로 빠르게 유사도 검색하기(Similarity Search)

    Faiss 는 Facebook AI 에서 개발한 유사도 검색 모델이다. 밀집 벡터의 효율적인 유사성 검색 및 클러스터링을 위한 라이브러리입니다. Faiss 는 numpy 나 torch 에서 제공해주는 cosine_similarity 보다 훨씬 빠릅니다. 빠른 이유는 벡터들 간의 연관성까지 포함하여 임베딩 정보를 가지고 있기 때문입니다. 즉, 벡터 길이(n)가 고정되어 있을 경우에는 빠른속도를 기대할 수 있지만 매번 다른 벡터들일 경우엔 매번 벡터간 연관성 계산 + 유사도 계산이 필요하기 때문에 기존 numpy 함수를 사용하는 것이 더 빠릅니다. 즉 faiss 는 길이(n)를 제한하는 대신 미리 벡터끼리의 정보를 계산해두고 그것을 이용하여 빠르게 검색합니다. ( 틀리면 마구마구 지적 부탁드립니다. ) 실습..

    [NLP]. 임베딩 벡터(embedding vector)를 문자열로 저장하는 방법(feat. byte type , base85 )

    Bi-Encoder의 장점은 임베딩한 벡터를 미리 연산을 해두어 속도가 빠르다는 장점이 있다. 여기서 임베딩값들을 메모리(RAM) 자원에 가지고 있는 것이 가장 좋지만 전 포스팅에서 이야기하였듯이 높은 메모리는 곧 서버 비용이다. 비용 절감을 위해서 벡터를 문자열로 변환해서 RDBMS에 저장해서 불러오는 방식으로 구현하기로했다. flaot 형식으로 저장하지 않고 문자열로 저장하는 이유는 문자열로 저장하는 것이 용량도 적게 들고 768열로 각각의 float를 저장해서 불러오는 것보다. 문자열로 저장한 값을 numpy에 np.fromstring() 매서드를 사용하는 것이 더 효과적이기 때문이다. 하지만 위 방법에는 몇 가지 문제가 있다. 1. 문자열의 길이가 너무 길다. : BERT는 기본적으로 768차원이..

    [딥러닝]. 효과적인 학습(training) 방법 모음

    1. FP32 와 FP16을 적절하게 사용하여 리소스를 절약하여 학습속도를 높힘 Mixed Precision을 이용하여 GPU resource를 효율적으로 사용할 수 있는 방법 https://bo-10000.tistory.com/32 [딥러닝 논문리뷰] Mixed Precision Training (ICLR 2018) NVIDIA와 Baidu에서 연구하고 ICLR 2018에 발표된 논문인 Mixed Precision Training을 바탕으로 정리한 글입니다. 딥러닝 학습 과정에서 Mixed Precision을 이용하여 GPU resource를 효율적으로 사용할 수 있는.. bo-10000.tistory.com 2. 추가 예정

    [챗봇]. 편집거리 알고리즘을 통한 오타 확인

    사람들이 채팅에서 사용하는 채팅체(구어체) 데이터들은 오타 혹은 줄임말등을 많이 사용하게 된다. 그러나 한글의 위대함 때문인지 오탈자를 사용하더라도 문맥에는 크게 지장가지 않는다. 그래서 친분이 있는 경우라면 더욱더 채팅할때 오타를 신경쓰지 않게된다.(나도 마찬가지) 기본적인 띄어쓰기 오류 , 애교가 섞인 말투(의도적) , 신조어 , 줄임말 등등,,, 하지만 인공지능 챗봇을 학습시킬때는 오타가 많을 경우 학습하기 어려운 측면이 있다. 물론 요즘 서브워드 기반인 워드피스 토크나이저를 사용하면 오타를 어느정도 보완하는 측면이 있지만. 오타를 정규화 해주는 게 좋은 성능을 야기할 수 있다. 이번 포스팅에서는 구어체 말뭉치를 가지고 자주 사용되는 오타를 확인해보고자한다. 말뭉치 데이터 AI-hub SNS 데이터..

    [NLP]. 구어체(채팅)데이터에서 필요한 품사만 가져오기 (feat.꼬꼬마 형태소 분석기)

    구어체 (카카오톡 채팅 대화)에서 필요한 품사(pos tag)만 뽑아내기. 구어체는 일상대화 텍스트이기 때문에 문어체와 다른 특징들이있다. 구어체 : 입말체. 구어체(口語體)는 일상생활에서 실제 입으로 발화되는 말을 문장으로 나타낸 것을 말한다. 문어체 : 문어체(文語體)란 일상생활에서 사용되지 않고 문서에 한하여 쓰이는 문체를 말한다. 그래서 불용어 또한 문어체와 구어체에 따라서 다르게 구별해야한다고 생각한다. 한국어는 불용어에 대한 정의가 없어서 구어체를 기준으로 샘플데이터를 가지고 주관적인 불용어 품사들을 걸러내어 보고자한다. 이 자료가 누군가에게 도움이 되었으면 좋겠다. 품사 태깅 기준은 꼬꼬마(kkm) 형태소 분석기로 진행함. 이유는 엘라스틱서치에 nori 토크나이저의 품사들이 꼬꼬마와 유사하고..

    [챗봇]. BERT 임베딩 벡터를(Embedding Vectors) RDBMS의 저장해야하는 이유

    챗봇을 개발하다 보면 정확도보다 속도가 더 중요하다는 생각을 하게 된다. 인공지능과 채팅을 하는데 허무맹랑한 소리를 하는 건 어느 정도 유저가 인용해 줄 수 있지만 인공지능이 답장을 느리게 하는 것은 사실상 하는 이유가 없기 때문이다. 검색 기반 챗봇 - 우리 서비스는 생성모델이 아닌 검색모델을 사용하여 챗봇을 개발하였음 위에서 말했듯이 챗봇은 정확도 보다 속도를 우선시하게 되는 데 그래서 우리는(Bi-Encoder) 방식을 채택하여 빠른 속도를 우선시했다. *Bi-Encoder : 임베딩 값을 미리 구해놓기 때문에 속도가 빠른 장점이 있지만 미리 구한 임베딩 값을 저장할 공간이 필요함. Bi-Encoder로 구현했지만 서버에서 실행을 했더니 임베딩 값(numpy)이 많은 메모리를 점유하고 있었다. (메..

    [NLP]. 도로명 주소 & 지번 주소 인식 정규표현식

    출처 : 당근마켓 블로그 https://medium.com/daangn/%EC%A3%BC%EC%86%8C-%EC%9D%B8%EC%8B%9D%EC%9D%84-%EC%9C%84%ED%95%9C-%EC%82%BD%EC%A7%88%EC%9D%98-%EA%B8%B0%EB%A1%9D-df2d8f82d25 import re input_text = "인천광역시 부평구 안남로 123 행복아파트 101동 101호" address = re.compile("(([가-힣A-Za-z·\d~\-\.]{2,}(로|길).[\d]+)|([가-힣A-Za-z·\d~\-\.]+(읍|동)\s)[\d]+)") address.search(input_text) 결과 :

    [NLP] Fine-tuning(파인튜닝)과 in-context learning(인컨텍스트 러닝)

    대규모 사전 학습 언어모델이 다운스트림 태스크를 학습하는 방식은 크게 3가지가 있습니다. Fine-tuning : 다운스트림 태스크 데이터 전체를 사용합니다. 다운 스트림 데이터에 맞게 모델 전체을 업데이트합니다. - 문서 분류 , 자연어 추론 , 질의응답 , 문장 생성 Prompt tuning : 다운스트림 태스크 데이터 전체를 사용합니다. 다운스트림 데이터에 맞게 모델 일부만 업데이트합니다. In-context learning : 다운스트림 태스크 데이터의 일부만 사용합니다. 모델을 업데이트하지 않습니다. 파인튜닝 방식으로 모델 전체를 업데이트 하려면 많은 비용이 듭니다. 파인튜닝 말고도 다른 방식이 주목받는 이유는 비용과 성능 때문입니다. 최근 언어 모델의 크기가 기하급수적으로 커지고 있고 파인튜닝..

    [챗봇]. 대화 텍스트 길이(length)에 대한 패널티(penalty)를 주는 방법

    Retrival 기반의 챗봇을 개발하다 보면 정확도(질문의 유사도)를 가지고 유사도가 가장 비슷한 질문을 찾아서 해당하는 답변을 리턴해주는 방식을 많이 사용하곤 한다. (유사도를 구하는 방법은 매우 다양함) 하지만 유사도가 높다고 해서 "좋은 답변"일까? 챗봇의 성능이 아무리 좋다고 하더라도 단답이나 장문의 답을 한다면 좋은 챗봇이 아니라고 생각한다. 챗봇이 아니라 일상 대화에서도 단답형 : Q : 너 밥 먹었어? A : 응.... , 네.... , 예~.... 장답형 : Q : 너 밥 먹었어? A : 밥을 먹었는데 밥은 현미밥이었고 반찬은 내가 좋아하는 ~~ 그런데 밥 먹다가 전화가 와서 전화를 받다가 다시 밥을 먹고~~ 주절주절 이렇게 얘기를 하면 대화가 단절되거나 어떻게 답해야 할지 모를 것이다. ..

    [annotation]. 텍스트 데이터 라벨링 꿀팁(2)

    https://unikys.tistory.com/307 [엑셀] 매크로로 선택영역의 특정 문자만 색 변환하기 * 목표: 엑셀에서 선택한 영역을 가져와서 각 문자열의 문자 중에 입력한 단어가 있으면 색을 변환하는 매크로 작성 * 작성 환경: 엑셀 2010 : 예를 들면 아래와 같은 엑셀이 있을 경우 'fer'를 빨간 unikys.tistory.com 전 포스팅에서 키워드들 통한 라벨링 진행 방법을 소개했다. 하지만 문장의 길이가 길 수록 해당 키워드가 어디에 위치하고있는지 찾기가 너무 힘들었다. 문장의 길이가 길면 그 만큼 라벨링 속도 저하 발생...ㅠㅠ 그렇다고 대충보기에는 모호한 데이터들이 많았다. "뒤지" 키워드의 경우 1) 너 뒤지고 싶냐? 2) 방을 다 뒤지고 나서도 찾을 수 없었어. 이런 키워드..