logo
기술 블로그
logo
CatLIP: 2.7배 빠른 범주 학습(Categorical) 기법에 대한 연구(feat. Apple)
Apple이 매주 연구 결과들을 공개하고 있는데, 뭔가 반가우면서도 어색한 미묘한 기분이네요😲요즘 Apple은 Visual Encoder에 진심인건지, 작년 말에는 CLIP보다 작은 크기로 더 나은 성능을 보이는 MobileCLIP에 대한 연구를 공개한데 이어,이번에는 Web Scale의 이미지-텍스트 쌍(Image-Text Pair) 데이터들을 더 빠르게 사전학습하는 CatLIP에 대한 연구를 공개했습니다.CLIP의 대조 학습(Contrastive Learning) 대신 범주 학습(Categorical Learning)을 사용하여 성능은 비슷하면서도 속도는 2.7배 가량 빠르다고 하는데요,심지어 사전 학습 모델의 가중치와 함께 모델 코드의 공개도 언급하였습니다.CatLIP: 대규모 이미지-텍스트 데이터로 2.7배 빠른 사전학습 및 CLIP 수준의 인식 정확도를 달성Apple이 이번에 공개한 CatLIP(Categorical Loss for Image-text Pre-training)은 OpenAI에서 소개한 CLIP(Contrastive Language-Image Pretraining)과 비교하여약 2.7배 빠른 사전 학습 속도를 보이는 새로운 방법입니다.OpenAI가 CLIP에서 사용한 Constrastive Pre-Training 기법 (출처: OpenAI 홈페이지)OpenAI가 CLIP에서 사용한 대조학습(Contrastive Learning) 기법은 엄청난 규모의 이미지들을 사용한 사전학습(Pre-training) 방법입니다.이전의 지도 학습(Supervised Learning)에서는 학습 데이터로 사용하는 이미지가 어떠한 것인지를 나타내는 레이블(Label, 정답)이 있어야 하기 때문에 대량의 데이터셋을 생성하기가 쉽지 않았습니다.OpenAI에서는 이를 해결하기 위해 인터넷에 공개된 다양한 이미지와 이를 설명하는 텍스트(명시적인 설명 또는 설명으로 추정되는 텍스트 등)를 모은 다음,사전 학습 시 하나의 배치 내의 여러개의 쌍에 대해서 유사성을 학습하였습니다.즉, 위 그림과 같이 이미지와 텍스트를 각각 인코더에 통과시켜 임베딩(Embedding)을 추출한 뒤,학습 시 사용하는 하나의 배치(Batch) 내에서 서로 같은 Image-Text 쌍에 대해서는 유사도가 높도록(Positive Sample, 위 그림의 I-T Matrix의 대각 성분),서로 다른 Image-Text 쌍에 대해서는 유사도가 낮도록(Negative Samples, 위 그림의 I-T Matrix의 대각 성분을 제외한 나머지) 학습하는 방식입니다.이러한 대조 학습 방식은 잡음(noise)이 많은 대량의 데이터셋을 처리하는데 있어 획기적인 성과를 보였지만,이미지와 텍스트 임베딩 간의 광범위한 쌍별(pairwise) 유사성을 확인하는 과정에서 다소 많은 연산 작업이 필요합니다.이를 위해 모델의 일부를 최적화하거나 전처리된 인코더를 사용하는 방법들이 제안되었지만, CatLIP에서는 아예 이러한 과정을 다르게 접근하였습니다.CatLIP은 CLIP에서 사용했던 전처리 과정을 대조적 방법(Contrastive)이 아닌 분류 작업(Categorical)으로 재구성함으로써,대조 학습(Contrastive Learning) 시에 사용하던 유사도 계산(Similarity Comptation) 과정을 생략하였습니다.이를 통해 CatLIP의 사전학습 속도가 CLIP보다 2.7배 가량 빠르게 개선되었으며, 적용하는 작업(Downstream Task)에서의 정확도는 비슷하게 유지함을 보였습니다.CatLIP의 주요 아이디어• None 새로운 사전 학습 접근 방식: CatLIP은 이미지-텍스트 데이터의 사전 학습을 분류 작업으로 처리하여 사전 학습 단계를 가속화하는 방법을 제시합니다. 이 접근 방식은 이 분야에서 처음 시도되는 것으로, 일반적으로 CLIP에서 볼 수 있는 대조적 학습 방법과는 다르게, CatLIP은 이미지-텍스트 전처리를 다중 레이블 분류 작업으로 취급합니다. 이러한 접근 방식을 통해 텍스트에서 파생된 레이블을 이미지에 직접 연결하여 학습 과정을 단순화합니다.• None 스케일링 향상: 소개된 방법인 CatLIP은 데이터 및 모델 스케일링 시 정확도를 향상시킵니다. 특히 작은 규모의 이미지-텍스트 데이터셋에서 CatLIP 하에 긴 학습 기간 동안 CLIP을 사용할 때보다 더 나은 성능을 보입니다.• None 효율성 및 속도: 사전 학습 시 각 이미지-텍스트 쌍(pair)들 간의 비교를 하지 않아도 됨으로써, CatLIP은 CLIP 대비 연산 오버헤드를 줄일 수 있었습니다. 이를 통해 대규모 데이터셋에서 모델 전처리 속도를 CLIP 대비 2.7배 향상시켰습니다.• None 전이 학습: 전통적인 전이 학습 접근 방식은 사전 훈련된 모델 백본을 사용하고 분류기(Classifier)의 가중치를 새로 초기화하는 것이었습니다. CatLIP은 타겟 작업 레이블과 관련된 임베딩을 분류 계층에서 추출할 수 있어, 이렇게 추출한 임베딩을 직접 새 작업의 분류 계층에 초기화하는 것을 가능하게 합니다. 이는 새로운 작업에서 레이블로 사용할 수 있어 효율적인 전이학습이 가능합니다.• None 광범위한 검증: 논문은 객체 탐지 및 의미론적 분할과 같은 다양한 하류 작업에 걸쳐 광범위한 실험을 자세히 설명하며, CatLIP이 학습한 표현이 CLIP이 학습한 표현과 비슷한 성능을 보임을 보여줍니다. 특히, CatLIP을 사용한 비전 트랜스포머(ViT B/16)는 COCO 데이터셋에서 평균 정밀도 점수 49.9를 달성하여 CLIP의 성능과 동등하지만 사전 학습 시간은 2.7배 빠르다는 점을 강조합니다.CatLIP은 Vision Transformer(ViT)를 이미지 인코더로 사용하여 이미지로부터 특징을 추출합니다.이 과정에서 ViT는 이미지를 패치로 나누고, 이 패치들을 시퀀스처럼 처리하여 각 패치의 특징을 학습합니다.또한, 앞에서 설명하였던 것처럼 사전 학습을 이미지에 대한 텍스트 레이블을 분류(Classification)하는 작업으로 보고 접근합니다.이를 위해 학습 시에는 텍스트 캡션으로부터 명사들을 추출한 뒤,이를 WordNet을
SK텔레콤
·
오늘
logo
Rockstar 프로그래밍 언어 알아보기: 코드로 노래 가사를 쓸 수 있다면?
안녕하세요 데보션 영 3기 5CEAN에서 활동 중인 권지원이라고 합니다.저는 종종 노래방에서 Linkin Park의 Given Up을 부르면서 스트레스를 풀곤 합니다. 코딩을 할 때는 유명한 락 밴드들의 노래를 하루종일 틀어놓고요.노래를 들으며 코딩을 하다 보면 이런 생각이 들 수 있습니다. 프로그래밍 언어와 노래는 아무런 연관이 없을까?"Just call my name, 'cause I'll hear you scream Master, Master"란 Metallica의 Master of Puppets 노래 가사를 보고, 프로그래밍 언어의 컴파일러를 생각해보는 겁니다.call에게 print 란 키워드 역할을 주고, my name이 변수 이름이라고 가정하면?공백을 기준으로 파싱하고, 특별한 규칙을 적용할 키워드를 정의한다면? 흥미로운 언어가 만들어지지 않을까?실제로 이런 농담 같은 생각에서 만들어진 언어가 존재합니다. 바로 오늘 소개할 프로그래밍 언어인 Rockstar입니다.The Art of Code 란 컨퍼런스를 보신 분 계신가요? 코드의 예술적인 면을 보여주는 아주 재미있는 강연입니다.그중에서도 제 눈을 이끈건 영상 말미에 소개된 강연자 Dylan Beattie가 제작한 Rockstar란 언어입니다.프로그래밍 언어 자체로도 아름다울 수 있다는 것을 깨닫게 해주었죠. 예제 코드를 한번 볼까요?해당 코드는 Rockstar로 쓰인 Fizzbuzz입니다.코드에 리듬만 붙이면 그럴싸한 노래가 될 것 같습니다.Rockstar 언어의 핵심 가치인 "If you can't sing it, you can't have it"이 드러난 코드입니다.그렇다면 Rockstar 언어는 어떻게, 그리고 왜 만들어지게 된 것인지 알아보겠습니다.Rockstar란 메탈 가사처럼 보이는 프로그램을 작성할 수 있는 동적 타입 컴퓨터 프로그래밍 언어입니다.Paul Stovell의 트윗에서 영감을 받아 Dylan Beattie에 의해 만들어진 언어로, 1980년대 하드 록과 파워 발라드 가사 컨벤션에 큰 영향을 받았습니다.Rockstar 언어는 왜 만들어진 걸까요? Rockstar 개발자에 따르면 해당 언어는 순전히 농담에서 출발한 언어라고 합니다.그리고 노래 가사를 컴파일하는 것이 멋지고 'CERTFIED ROCSTAR DEVELOPER'라고 스티커를 붙일 수도 있다는 점이 장점인 언어라 홍보하고, 그 이외에 기능적인 장점은 일절 언급하지 않습니다.이것도 이 언어의 매력적인 점이라고 볼 수 있죠 😄언어의 주요 특징으로는 거의 모든 코드가 문자라는 것입니다.Rockstar의 주요 문법은 Hello World 코드 샘플을 분석해보며 훑어보겠습니다.해당 Rockstar 코드를 실행하면 콘솔 창에 Hello World가 출력됩니다. 엄청 길지만 참 멋진 코드입니다.Rockstar에서는 주석을 소괄호로 처리합니다.이번 게시글에서는 가볍게 알아보는 자리이므로 예제에 주석으로 코드가 의미하는 바를 분석해놓았고, 예제 밑에 주요 문법 특징을 적어보았습니다.• None Rockstar만의 독특한 언어 기능.• None 개발자 내면 깊숙한 곳의 공포, 두려움을 표현하도록 도와줍니다.• None• None 변수 이름 + 키워드 is, are, was, were 뒤에 오는 해당 줄의 코드는 모두 10진수로 취급됩니다.• None 따라서 The prize == 7이 됩니다.• None Rockstar에서 문자와 숫자는 유니코드를 기준으로 변환됩니다.• None with 뒤에 있는 원소를 삽입• None 변수 이름은 case insensitive이기 때문에 The dawn과 the dawn은 모두 같은 변수입니다.Rockstar 깃헙 레포지토리에 있는 예제를 이용해 "Hello World"를 출력해보았습니다.단순히 문자열만 출력하는 방법도 있지만 Rockstar 언어의 특징을 살려 "Hello World"를 출력한 코드를 보는 것이 더 의미있을 것 같아서 가져왔습니다.가끔 공부를 하다 보면, 이런저런 것들을 따지느라 프로그래밍 언어 자체의 매력을 잊어버릴 때가 있습니다.저는 그럴 때마다 재미난 것들을 탐구하며 시간을 보내곤 합니다. 이번 탐구 활동의 결과물인 프로그래밍 언어 Rockstar를 소개글을 작성해보았습니다.거의 처음 작성해보는 게시글이라 글의 전개나 글이 어색한 면이 없지 않아 있지만, 제가 해당 언어를 보고 느꼈던 즐거움이 전해졌으면 좋겠습니다.최근에는 상대적으로 친숙한 언어인 Java로 Rockstar 컴파일러를 조금씩 제작하고 있는데, 생각보다 쉽지 않네요 🥲모두 힘들더라도 🤘Rock n' Roll 🤘하며 이겨냅시다. 화이팅 !!앞서 언급한 The Art of Code 컨퍼런스 번역본에 관심 있으신 분 계신가요?
SK텔레콤
·
오늘
logo
AI와 엣지 컴퓨팅의 결합
AI가 알파고에서 챗GPT로 초 거대화되고 클라우드의 성능이 더욱 좋아지면서, 엣지 컴퓨팅은 새로운 전환의 계기가 만들어지고 있습니다. 새로운 정보 단말기에는 AI가 기본으로 탑재될 것이고, AI를 품은 엣지 컴퓨팅은 더 많은 기기에 필수 기술로 자리 잡을 것으로 전망합니다.
삼성SDS
·
오늘
logo
JPA에서 아이디를 자동증가 값으로 사용 시 하이버네이트의 @NaturalId 사용해 보기
JPA에서 아이디를 자동증가 값으로 사용 시 하이버네이트의 @NaturalId 사용해 보기신규 테이블 생성 시 기본키 생성은 어떻게 하고 계시나요? 저희팀에서는 기본 RDBMS 로 MySQL을 사용하고 있습니다.MySQL의 경우 기본키를 Clustered Index 로 사용하고 있습니다. Clustered Index란 데이터베이스 테이블에서 데이터를 저장하는 물리적인 순서를 인덱스 순서로 사용하는 것을 말합니다. 그래서 데이터 삽입 시 기본키 기준으로 데이터가 정렬되기 때문에 자동증가값 사용 시 삽입 성능이 좋습니다. 그리고 배치와 같이 대량의 데이터를 청크 단위로 조회할 때 offset-limit 쿼리로 조회했을 때보다는 아래처럼 기본키를 기준으로 조회했을 때 훨씬 빠르게 조회할 수 있습니다. 이러한 이유로 주로 기본키에는 auto_increment를 사용해 왔습니다.운영환경과 테스트환경의 아이디값 불일치로 인한 문제저희팀에서는 테스트환경과 운영환경을 함께 운영하고 있는데요, 테스트 환경의 경우에는 테스트용도로 데이터를 생성하다보니 운영환경과는 다른 데이터를 종종 생성하고는 합니다.그래서 자동증가 값을 기본키로 사용하는 엔티티 대부분이 운영환경과 테스트환경의 아이디값이 다르게 되어 있습니다.운영환경과 테스트환경의 아이디값이 달라서 문제가 됐던 경험이 있지 않으신가요?운영환경과 테스트환경의 아이디값 불일치 문제를 설명해보기 위해 특정한 요구사항이 들어온 상황을 가정해 보겠습니다.특정 상품의 판매 촉진을 위해 특정한 기간동안 특정 상품 몇개에 대해서만 80% 할인을 해야 한다는 요구사항이 들어왔습니다.현재 상품 테이블 구조는 아래와 같습니다.엔티티는 다음과 같습니다.현재는 할인 기능이 없습니다. 개발기간이 충분하다면 할인 기능을 개발하여 적용하고 싶지만, 안타깝게도 내일 모레부터 바로 운영환경에 적용되어야 하는 상황입니다.운영 배포전 테스트도 필요하기 때문에 내일 오전까지 개발완료 후 내일 오후부터는 테스트환경에 배포하여 테스트 이후에 모레 오전에 운영환경에 배포하기로 하였습니다.운영환경과 테스트환경의 상품이 모두 동일하면 좋았겠지만, 아쉽게도 테스트환경에는 테스트용으로 생성했던 상품들이 따로 존재합니다. 따라서 아래와 같이 동일한 상품이라도 아이디가 각각 다르게 등록되어 있습니다.하루 만에 모든 기능 개발을 끝마쳐야 하기 때문에 일단은 할인대상 상품 아이디 목록을 하드코딩하기로 하였습니다. 상품 아이디가 운영환경과 테스트환경에 각각 다르게 생성되어 있어서, 해당하는 상품들의 아이디를 운영환경과 베타환경에서 각각 찾아서 아래와 같이 사용하는 형태로 일단락지었습니다.열심히 개발하여 테스트환경에 배포하려는 순간 추가 요구사항이 발생하였습니다. 운영배포일 오전에 운영환경에 XXX와 YYY라는 상품이 신규로 생성되게 되는데, 신규로 생성되는 2개의 상품중 XXX 상품에도 동일하게 할인을 적용해 달라는 요구사항이였습니다.베타환경의 경우 새로운 상품을 추가 후 바로 해당 상품의 아이디를 yml 파일에 추가하였지만, 운영환경은 내일 상품이 새로 생성 되어야만 아이디 값을 알 수 있어서 운영환경에 추가된 상품의 아이디 값을 어떻게 yml 파일에 추가할지 고민이 생겼습니다.먼저 떠오른 생각은 상품을 먼저 생성 후 생성된 상품의 아이디를 확인 후 코드상에 추가한 뒤 배포하는 방법이었습니다.하지만 배포를 위해 아침 일찍 일어나 코딩까지 하기에는 너무나 억울한 마음이 들었던 저는 아이디 값이 어차피 자동증가 값이니 현재까지의 상품등록 추이를 보았을 때 알파벳순으로 상품이 등록되었으니 이번에도 XXX, YYY순으로 상품이 등록될 것으로 예상하여 현재 운영환경에 등록된 가장 큰 아이디값에 +1만 해주면 될 것이라는 생각을 하게 되었습니다.그래서 현재 운영환경에 등록된 상품 중 가장 큰 아이디값인 5에다가 +1 해준 값인 6을 아래처럼 yml 파일에 추가하였고 운영환경에 그대로 배포하였습니다.오전에 운영환경에 배포 이후 즐겁게 일하고 있던 저에게 갑자기 문의가 들어왔습니다.오늘 운영환경에 추가한 상품 중 XXX 상품이 할인되어야 하지만, 실제로는 YYY 상품이 할인되고 있다는 문의였습니다.원인은 상품의 순서가 예상과는 달리 XXX, YYY 순서로 등록되지 않고 반대 순서인 YYY, XXX 순서로 상품이 등록되는 바람에 YYY 상품이 할인되고 있었습니다.급하게 운영환경에 하드코딩된 아이디 값을 고쳐서 재배포 이후에는 정상적으로 XXX 상품이 할인될 수 있었습니다.변경되지 않는 유니크 키가 설정된 컬럼을 사용해 보자위의 사례와 같이 운영환경과 테스트환경의 자동증가하는 아이디값이 불일치하여 발생하는 일을 방지하기 위해서는 어떻게 해야 할까요?여러 가지 방법이 있겠지만 한 가지 방법으로는 아래와 같이 자동 증가하는 아이디값 외에 유니크 키가 적용된 컬럼을 하나 더 추가하여 코드에서 자동증가값 대신에 유니크 키 컬럼을 사용해 보는 방법이 있습니다.컬럼의 경우 아이디 값 대신에 사용되어야 합니다. 즉 생성만 가능하고 변경이 되면 안 됩니다. 이에 아래와 같이 생성자에서만 전달받도록 엔티티를 수정하였습니다.추가된 유니크키 컬럼값을 통해 운영환경과 테스트환경에서 동일한 식별값으로 데이터를 생성할 수 있게 되어 아이디가 불일치하여 생기는 문제는 예방할 수 있게 되었습니다.그래서 이제부터는 아이디 대신 유니크키 컬럼 값으로 조회하여 사용하기로 마음먹고 아래와 같이 메서드를 에 추가 후 기존 메서드를 사용하는 부분들을 모두 메서드를 사용하도록 수정하기로 하였습니다.사용시 모든 기능은 정상동작하지만, 한 가지 마음에 걸리는 게 생겼습니다.동일한 트랜잭션에서 동일한 엔티티를 여러 번 조회하는 경우, 를 사용하면 한 번만 쿼리가 발생하지만 를 호출하면 매번 쿼리가 발생한다는 점입니다. ProductRepositoryTest.java[참고] MySQL 이나 MariaDB 드라이버를 사용하는 경우 아래와 같은 설정으로 쿼리 로그를 남길 수 있습니다.하이버네이트의 @NaturalId를 사용해 보자찜찜함을 해결하기 위해 열심히 이곳저곳을 찾아보다가 하이버네이트에는 가 붙은 필드가 아닌 필드에 선언하여, 가 붙은 필드와 유사하게
우아한형제들
·
오늘
logo
고객 구매 경험의 진화 방향 - 자동차 구매 경험을 중심으로
디지털 고객 경험을 통해 상품을 구매하고 서비스를 상호작용하는 방식이 변화하고 있습니다. 자동차 판매업체는 소비재 판매업체로부터 변화를 수용하고 진화하는 방법을 배울 수 있습니다.
삼성SDS
·
오늘
logo
삼성바이오로직스, 생성형 AI 기반 업무 자동화 사례
생성형 AI에서 정확한 E2E 데이터를 연결하려면 데이터의 구조화 및 표준화가 필요하며, RAG나 프롬프트 작성도 표준화된 데이터 구조나 형식을 반영해야 합니다.
삼성SDS
·
오늘
기술 블로그 더 보기
Copyright © 2024. Codenary All Rights Reserved.