2023.10.03

HyenaDNA:
LLMでゲノム解析してみた(入門編)

はじめに

こんにちは、グループ研究開発本部・AI研究室のT.I.です。前回のBlogでは、Hyenaという新しい機械学習モデルをDNA配列の解析に応用するという HyenaDNA という研究を簡単に紹介してみました。 HyenaDNAは、GitHub (https://github.com/HazyResearch/hyena-dna) にて実装が公開されていますので、今回のBlogでは、実践編として公開されているコードを元にHyenaDNAを実際に動かしてみたいと思います。

Genomic Benchmarks

前回のBlogで紹介したように、HyenaDNAではいくつかのベンチマークで評価されています。 今回は、そのなかの1つであるGenomic Benchmarks( https://github.com/ML-Bioinfo-CEITEC/genomic_benchmarks)を利用してみます。 Genomic Benchmarksを利用をするためには、以下のコマンドでインストールします。

$ pip install --quiet genomic-benchmarks

利用可能なデータセットは、以下のコマンドで確認できます。

from genomic_benchmarks.data_check import list_datasets
list_datasets()
  1. Mouse Enhancers
  2. Coding vs Intergenomic
  3. Human vs Worm
  4. Human Enhancers Cohn
  5. Human Enhancers Ensembl
  6. Human Regulatory
  7. Human Nontata Promoters
  8. Human OCR Ensembl
  9. Drosophila enhancers

ここで、最初の8つのタスクについて、HyenaDNAでは性能比較を行っています。ここで最後のDrosophila(ショウジョウバエ) Enhancersは、 HyenaDNAでは使用されていませんが、おそらくヒトとは関係ないので評価していないのかと思われます。 なお、Enhancerとは転写因子と呼ばれるタンパク質が結合し、その上流(下流)の遺伝子の発現を調節するDNA配列のことです。 GenomicBenchmarkでの結果は以下の表のように、HyenaDNAの性能がCNNを大きく上回り、8個中7個のタスクでTransformerよりも高性能です。

Dataset CNN| Transformer| HyenaDNA
Mouse Enhancers 69.0 80.1 84.3(+15.3)
Coding vs Intergenomic 87.6 88.8 87.6(+3.5)
Human vs Worm 93.0 95.6 96.5(+3.5)
Human Enhancers Cohn 69.5 70.5 73.8(+4.3)
Human Enhancers Ensembl 68.9 83.5 89.2(+20.3)
Human Regulatory 93.3 91.5 93.8(+0.5)
Human Nontata Promoters 84.6 87.7 96.6(+12)
Human OCR Ensembl 68.0 73.0 80.9(+12.9)

HyenaDNAの論文の表4.1より作成したGenomic Benchmarkの性能(Top-1 Accuracy)比較結果

データセットの詳細は、

import genomic_benchmarks
genomic_benchmarks.data_check.info('drosophila_enhancers_stark', version=0)

で確認できます。

Dataset `drosophila_enhancers_stark` has 2 classes: negative, positive. The length of genomic intervals ranges from 236 to 3237, with average 2118.1238067688746 and median 2142.0. Totally 6914 sequences have been found, 5184 for training and 1730 for testing.

このデータセットでは、positiveとnegativeの2クラス分類を行うことになります。入力長としては、236から3237の間の長さの配列が与えられます。データセットのダウンロードは以下の通りです。

genomic_benchmarks.loc2seq.download_dataset('drosophila_enhancers_stark', version=0, dest_path='.')

個別のファイルは、以下のようなフォルダ構成になっています。

$ tree -L 2 drosophila_enhancers_stark
drosophila_enhancers_stark
├── test
│   ├── negative
│   └── positive
└── train
    ├── negative
    └── positive

データはそれぞれ、アデニン(A)、シトシン(C)、グアニン(G)、チミン(T)の文字列で表現されています。例えば、以下のようなファイルがあります。

$ cat drosophila_enhancers_stark/test/negative/999.txt
CCGCCGACGGCCAGCAGAACCGGACGCAGTACCAGCCGCCTTGACATCAGCGACATGGAATCCATTTATGGGTACCTAAAGCCCCGCAAGCCGCGCAGCCTCAGCCTGAAGAAAATCCAAATACTCGACTACTAAACGGACACGTGAATTTCTATGGGCTTGCTCTAAATCGAAACGAGGTTATATGGCCCAGACATCGATATTAGTTATTGTTTTTTGTTGCCCTATCCCCTTGGAGCGGATGATGGGTGGCTGTACATACATATATGCTATATTATACCCACAAACGCATCTCGGTTACCTCCTTGCCCGGTGAACAGAACCACTAAACTGTACGATACTTTTACTAACATAGCACCTTGGACTCCTCTAGCCTGGACAGTCACGAAACGCAAATGTACATACACCAAGTGGGAGTGGGTTACTGATTTTAGAGGTAGTCCAAAGTTCAAACGAGTGGGTTGTAATCTGTGGAATAATACACTTACATTACATTATATCCCAAAAAAGAGATAATGCAATTAAACAGATAATACCTTCACCAGATTACAACCAAGTACCCGCTTGGGTCTACCAATAGAATCCACCCACCCCAGCACACATAATTATCCCGACAATTGTACACGCACCCGATTTTTAACCACGGATTTCTGTGCTTCTTGTAGATTCGGAGCTTGTTGAATCACCCTACAATCACATCTACGGACGCCATTTACCGCTGCCAACGCGCGGCTACGTGCCCACGCCACGCATGTTCATCGGGGAATGGGACTGAGCGTAGTTCACACCGCACCTGGGCGGGATTTTAGCCGGATTTTGAGCGGCCAAGGCACAAAACACACCACAACACTTGCACATCCCGGCGTGAGAGGGAACGACGCCTACCGTGCAGAGCTAATTTAAGTCAACCGGCTGCACACAGCTTGAAATATTATTTACATTATATTAATTTAGCAAAATATTATGGTAAAATAATATTAGGCTAGGCATAAGCAGCAACAAAAAAAACAAGAGTAATCGCAAACCATTGTAACATTTAGTGCCGTGATTTTTCGCGCTTTTCCCCTAGCAATTTTGAGATTACGCACTTGAGCCAATTTTGTTTACCCTGTTGTACGAAATGAATGAATAGCCATTACATCACGAGTTCAGTTAAGCTTTTAAGTATATTGTAAATTTCTCTTGAGCAGCCGTCAACTCAACTGGCCTGTTTGCGTATTTACTTGATAAATGTTCTTAACTACGAATTTTTCTAGTAAAAACTCAAACAAGCGTTGTCTAACAGGCTGCTGTTTTTTATTTTATATCTGTAAAATTCTGTAATATTCTGTATTGTGTATGCAACGTAATAAAAATAATCTTTTAAAACAATCCGTTTAATTTTGGTCTTCTAAAATGAAAACTTTTTTCATTGCTTTAAACTAAAGATTTGAATTGCTCACTATACATGGCATTCCTGGTAATTACATGTAGTAATCGGGATTCCAATCTGGTGGGCGCATATGATCTGGATTGATTCCACCCTGTCCCGGCCTATTCGGGTTCAGGGGATTGAACGGGTCGAAGCGGGGCACGGGTCCCGGGCCCATATTTGGGCGTGATGGAAAGCTGAACAGGTTACCATGACCACCGCGACCCAGTGGATCGAGATCCCCGCGTCCAACGTCCGGAAATCCAAAAGGGCGAGGCTCGAATGCACTTGGAATGAAGGATCTAAACGAGGGGAAACGATTAACGAGTGTATAAAAAACTATCCACAAGTGTTCTTACCCGCCACGCCTTGGCTCGCCGATGCGCAAGGGATCTGGATCCGATCCAATGGGGCGTGGTGAGTTGGTCGTCTGCGTGGTAACTTCGCGCGAGTTTCCCGTGAATACAGGGTCTAGAAGCTCCCTACGGTAGCGTTCAACAATCTCTGAGGCACTCGGCATTATGGTGGTGATGCCTCCCTTGACCTCAGGTACCAGGGTCTCTGGTTCTACGCAGATGTTGGATACCTTCTTAGTGTTGATGTCCAACAGGTTGATCAGCAGGGAGCCCTCGGTGATGTGGCCCAGCAGCAAATACAGCATCTTATCGTGCACGTAGCGCAGCGAGTACTTGGTATCGTCATCATTCCAGCTGTCCGGCAGCAGCTCACTGCCCTCCTCCTCCGGCAAGGTTTTCTATGGAATTCCAGATGATTTCACTAATATGCGTGGCCATAATCATACTCACATCATCGCCAACGCCAACG

HyenaDNAを(ちょっと)動かしてみる

HyenaDNAはPyTorchで実装されています。具体的なインストール方法については、公式レポジトリで解説がありますが、今回は簡単のため1つのファイルだけでHyenaDNAのモデルが実装されているstandalone_hyenadna.py (https://github.com/HazyResearch/hyena-dna/blob/main/standalone_hyenadna.py) を実行してみます。なお、huggingface.py (https://github.com/HazyResearch/hyena-dna/blob/main/huggingface.py) を利用すると事前学習済みモデルを利用できます。これらはヒトのレファレンスゲノム配列(hg38)を使用して、LLMのように次の塩基の予測(Next Token Prediction)で事前学習されています。以下が利用できるモデルの一覧です。モデル名の後にあるのはそれぞれ事前学習、ファインチューニング、推論に利用するのに必要なGPUのリソースです。

  • tiny-1k (T4 16GB, T4 16GB, T4 16GB)
  • tiny-1k-d256 (T4 16GB, T4 16GB, T4 16GB)
  • small-32k (A100 40GB, T4 16GB, T4 16GB)
  • medium-160k (A100 40GB, A100 40GB, T4 16GB)
  • medium-450k (A100 40GB, A100 40GB, T4 16GB)
  • large-1m (A100 80GB, A100 80GB, A100 40GB)

特に、大型モデルの学習時は前回のBlogで解説したように短い配列の学習から始めて、段階的に長い配列の学習をしています。

HyenaDNAの事前学習のアニメーション(前回Blogより)

まず、最初に必要なlibraryをインストールします。

$ pip install --quiet einops torch torchvision transformers OmegaConf

そして、実行に必要なソースコードもダウンロードしておきます。

$ wget https://raw.githubusercontent.com/HazyResearch/hyena-dna/main/standalone_hyenadna.py
$ wget https://raw.githubusercontent.com/HazyResearch/hyena-dna/main/huggingface.py

HyenaDNAのモデルを作成するには以下のようにします。(なお、以下のコードなどは公式リポジトリで公開されているものを元に作成してあります。)

import torch
from standalone_hyenadna import HyenaDNAModel

use_head = True
n_classes = 2
backbone_cfg = {
    "d_model": 128,
    "n_layer": 2,
    "d_inner": 512,
    "vocab_size": 12,
    "resid_dropout": 0.0,
    "embed_dropout": 0.1,
    "fused_mlp": False,
    "fused_dropout_add_ln": True,
    "residual_in_fp32": True,
    "pad_vocab_size_multiple": 8,
    "return_hidden_state": True,
    "layer": {
        "_name_": "hyena",
        "emb_dim": 5,
        "filter_order": 64,
        "local_order": 3,
        "l_max": 1026,
        "modulate": True,
        "w": 10,
        "lr": 6e-4,
        "wd": 0.0,
        "lr_pos_emb": 0.0
    }
}
device = 'cuda' if torch.cuda.is_available() else 'cpu'
print("Using device:", device)

model = HyenaDNAModel(
    **backbone_cfg, use_head=use_head, n_classes=n_classes
)

事前学習済みのモデルを利用する場合は、以下のようにします。

import torch
from huggingface import HyenaDNAPreTrainedModel

pretrained_model_name = 'hyenadna-tiny-1k-seqlen'
use_head = True
n_classes = 2
backbone_cfg = None
device = 'cuda' if torch.cuda.is_available() else 'cpu'
print("Using device:", device)

model = HyenaDNAPreTrainedModel.from_pretrained(
    './checkpoints',
    pretrained_model_name,
    download=True,
    config=backbone_cfg,
    device=device,
    use_head=use_head,
    n_classes=n_classes,
)

Colaboratoryで公開されているサンプル・コードからGenomic Benchmark Datasetを利用する際に必要なモジュールを抜粋すると以下の箇所になります。

import torch
from random import random
import numpy as np
from pathlib import Path
from torch.utils.data import DataLoader

from genomic_benchmarks.loc2seq import download_dataset
from genomic_benchmarks.data_check import is_downloaded

# helper functions
def exists(val):
    return val is not None

def coin_flip():
    return random() > 0.5


string_complement_map = {'A': 'T', 'C': 'G', 'G': 'C', 'T': 'A', 'a': 't', 'c': 'g', 'g': 'c', 't': 'a'}
# augmentation
def string_reverse_complement(seq):
    rev_comp = ''
    for base in seq[::-1]:
        if base in string_complement_map:
            rev_comp += string_complement_map[base]
        # if bp not complement map, use the same bp
        else:
            rev_comp += base
    return rev_comp


class GenomicBenchmarkDataset(torch.utils.data.Dataset):

    '''
    Loop thru bed file, retrieve (chr, start, end), query fasta file for sequence.
    Returns a generator that retrieves the sequence.

    Genomic Benchmarks Dataset, from:
    https://github.com/ML-Bioinfo-CEITEC/genomic_benchmarks


    '''

    def __init__(
        self,
        split,
        max_length,
        dataset_name='human_enhancers_cohn',
        d_output=2, # default binary classification
        dest_path="/content", # default for colab
        tokenizer=None,
        tokenizer_name=None,
        use_padding=None,
        add_eos=False,
        rc_aug=False,
        return_augs=False,
    ):

        self.max_length = max_length
        self.use_padding = use_padding
        self.tokenizer_name = tokenizer_name
        self.tokenizer = tokenizer
        self.return_augs = return_augs
        self.add_eos = add_eos
        self.d_output = d_output  # needed for decoder to grab
        self.rc_aug = rc_aug

        if not is_downloaded(dataset_name, cache_path=dest_path):
            print("downloading {} to {}".format(dataset_name, dest_path))
            download_dataset(dataset_name, version=0, dest_path=dest_path)
        else:
            print("already downloaded {}-{}".format(split, dataset_name))

        # use Path object
        base_path = Path(dest_path) / dataset_name / split

        self.all_paths = []
        self.all_labels = []
        label_mapper = {}

        for i, x in enumerate(base_path.iterdir()):
            label_mapper[x.stem] = i

        for label_type in label_mapper.keys():
            for x in (base_path / label_type).iterdir():
                self.all_paths.append(x)
                self.all_labels.append(label_mapper[label_type])

    def __len__(self):
        return len(self.all_paths)

    def __getitem__(self, idx):
        txt_path = self.all_paths[idx]
        with open(txt_path, "r") as f:
            content = f.read()
        x = content
        y = self.all_labels[idx]

        # apply rc_aug here if using
        if self.rc_aug and coin_flip():
            x = string_reverse_complement(x)

        seq = self.tokenizer(x,
            add_special_tokens=False,
            padding="max_length" if self.use_padding else None,
            max_length=self.max_length,
            truncation=True,
        )  # add cls and eos token (+2)
        seq = seq["input_ids"]  # get input_ids

        # need to handle eos here
        if self.add_eos:
            # append list seems to be faster than append tensor
            seq.append(self.tokenizer.sep_token_id)

        # convert to tensor
        seq = torch.LongTensor(seq)

        # need to wrap in list
        target = torch.LongTensor([y])

        return seq, target

モデルの訓練、テストについては以下の通りです。

def train(model, device, train_loader, optimizer, epoch, loss_fn, log_interval=10):
    """Training loop."""
    model.train()
    for batch_idx, (data, target) in enumerate(train_loader):
        data, target = data.to(device), target.to(device)
        optimizer.zero_grad()
        output = model(data)
        loss = loss_fn(output, target.squeeze())
        loss.backward()
        optimizer.step()
        if batch_idx % log_interval == 0:
            print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(
                epoch, batch_idx * len(data), len(train_loader.dataset),
                1.   * batch_idx / len(train_loader), loss.item()))

def test(model, device, test_loader, loss_fn):
    """Test loop."""
    model.eval()
    test_loss = 0
    correct = 0
    with torch.no_grad():
        for data, target in test_loader:
            data, target = data.to(device), target.to(device)
            output = model(data)
            test_loss += loss_fn(output, target.squeeze()).item()  # sum up batch loss
            pred = output.argmax(dim=1, keepdim=True)  # get the index of the max log-probability
            correct += pred.eq(target.view_as(pred)).sum().item()

    test_loss /= len(test_loader.dataset)

    print('\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.2f}%)\n'.format(
        test_loss, correct, len(test_loader.dataset),
        100. * correct / len(test_loader.dataset)))

Downloadしたデータを訓練・テストに分けてモデルで実行できるようにTokenizerを作成し、データセットを作成します。 ここでデータセットとしては、Human Enhancers Cohn(Enhancer Identification using Transfer and Adversarial Deep Learning of DNA Sequences)を利用します。これは、総数27,791の長さ500の塩基配列のデータセットで、positiveとnegativeの2クラス分類を行うものです。

from standalone_hyenadna import CharacterTokenizer

max_length = 500
tokenizer = CharacterTokenizer(
    characters=['A', 'C', 'G', 'T', 'N'],  # add DNA characters, N is uncertain
    model_max_length=max_length + 2,  # to account for special tokens, like EOS
    add_special_tokens=False,  # we handle special tokens elsewhere
    padding_side='left', # since HyenaDNA is causal, we pad on the left
)

use_padding = True
dataset_name = 'human_enhancers_cohn'
batch_size = 256
rc_aug = True  # reverse complement augmentation
add_eos = False  # add end of sentence token

ds_train = GenomicBenchmarkDataset(
    max_length = max_length,
    use_padding = use_padding,
    split = 'train',
    tokenizer=tokenizer,
    dataset_name=dataset_name,
    rc_aug=rc_aug,
    add_eos=add_eos,
)

ds_test = GenomicBenchmarkDataset(
    max_length = max_length,
    use_padding = use_padding,
    split = 'test',
    tokenizer=tokenizer,
    dataset_name=dataset_name,
    rc_aug=rc_aug,
    add_eos=add_eos,
)

train_loader = DataLoader(ds_train, batch_size=batch_size, shuffle=True)
test_loader = DataLoader(ds_test, batch_size=batch_size, shuffle=False)

損失関数としてCross Entropy Lossを利用し、optimizerを作成します。

import torch.optim as optim
import torch.nn as nn

# loss function
loss_fn = nn.CrossEntropyLoss()

learning_rate = 6e-4  # good default for Hyena
weight_decay = 0.1

# create optimizer
optimizer = optim.AdamW(model.parameters(), lr=learning_rate, weight_decay=weight_decay)

さて、ようやくモデルの訓練を行います。

model.to(device)

num_epochs = 10
for epoch in range(num_epochs):
    train(model, device, train_loader, optimizer, epoch, loss_fn)
    test(model, device, test_loader, loss_fn)
    optimizer.step()

以上を実行すると以下のようにHyenaDNAのモデルの学習とテストが進んでいきます。

Train Epoch: 0 [0/20843 (0%)]   Loss: 0.690840
Train Epoch: 0 [2560/20843 (12%)]   Loss: 0.569274
Train Epoch: 0 [5120/20843 (24%)]   Loss: 0.549916
Train Epoch: 0 [7680/20843 (37%)]   Loss: 0.591534
Train Epoch: 0 [10240/20843 (49%)]  Loss: 0.565957
Train Epoch: 0 [12800/20843 (61%)]  Loss: 0.517197
Train Epoch: 0 [15360/20843 (73%)]  Loss: 0.614621
Train Epoch: 0 [17920/20843 (85%)]  Loss: 0.516811
Train Epoch: 0 [20480/20843 (98%)]  Loss: 0.516065

Test set: Average loss: 0.0022, Accuracy: 4967/6948 (71.49%)

Train Epoch: 1 [0/20843 (0%)]   Loss: 0.530085
Train Epoch: 1 [2560/20843 (12%)]   Loss: 0.528274
Train Epoch: 1 [5120/20843 (24%)]   Loss: 0.527972
Train Epoch: 1 [7680/20843 (37%)]   Loss: 0.527023
Train Epoch: 1 [10240/20843 (49%)]  Loss: 0.521246
Train Epoch: 1 [12800/20843 (61%)]  Loss: 0.543012
Train Epoch: 1 [15360/20843 (73%)]  Loss: 0.540115
Train Epoch: 1 [17920/20843 (85%)]  Loss: 0.544496
Train Epoch: 1 [20480/20843 (98%)]  Loss: 0.495625

Test set: Average loss: 0.0021, Accuracy: 5084/6948 (73.17%)
...

試しに適当な配列を入力して遊んでみます。

import numpy as np

def inference_example(model, device, max_length=100):
    sequence = ''.join(np.random.choice(['A', 'C', 'T', 'G'], max_length))
    print('# input sequence:', sequence)
    tok_seq = tokenizer(sequence)
    tok_seq = tok_seq["input_ids"]  # grab ids

    # place on device, convert to tensor
    tok_seq = torch.LongTensor(tok_seq).unsqueeze(0)  # unsqueeze for batch dim
    tok_seq = tok_seq.to(device)

    # prep model and forward
    model.to(device)
    model.eval()
    with torch.inference_mode():
        output = model(tok_seq)
        pred = output.argmax(dim=1).item()

    print(f'# prediction:', pred)

for i in range(10):
    inference_example(model, device)

なんかそれっぽい、結果が出てきましたね(まあ、ランダムな配列なんで意味はないですが)。

# input sequence: GGCTTCGAGCAGTGAACGCACGTGGTTTCAGGAGAGGCCGGGAGTTTTCTTTAGGCATCAGAGCCATCGGACAACGTGGTTCGCCCTAATAAATCCGCTC
# prediction: 0
# input sequence: GCACATTGACCGGGGTACGTGTCGTTATGACCTGTGTGAATCTTGGGGTCGAATATGCCGTGTGATTGACGCCGCTTGATTTATCCCGTGTCGCTCCGAA
# prediction: 0
# input sequence: TGGTTCTTATCACTCTCAAAGAAGGTCTCCCCAGACGGCACGTTTTGACCTGACGGGTGTCTGACTGTCCTTAGGAACAAAGATCGTGTGTATGCTGGGG
# prediction: 0
# input sequence: CTAGAACCAGAACCGGGGACAGAACGCCGTTCACTAGACGCGGGGTTTTGGTCGCGCTCCCGCCGACGTGAAAGTCTATCTTCTCCCATAGCCTTCCAAT
# prediction: 0
# input sequence: CTCAATCCGGAGCCGTCATATTCTATGTGCTCCTCCTTACGACCTATTTTATATTACATTGTTGGGGATGCATGCGTTCTCTCGTCGTGCTGTTATCTGA
# prediction: 0
# input sequence: ATCGGATGGTATACCAGCGGTTGCACAAACAACAAACGAGCACCATCTTGTTTCCCTCATGACAGCTCTACGATGGCATCTGAGTCGATATCACTCGGGG
# prediction: 1
# input sequence: AATTATAAGGCAAGTAGCGGGCGCGCATAGGCTTCAACCACACTTGAAAGAGTCAGTTTGTTACGCAAACACCAAAGCAGATTGCTAGGACTGGTACATG
# prediction: 1
# input sequence: TAACCGATTCTGAGCGCGCTGGTCAGTTAAGCATCATCGCGCGAGTTAGTCCAGGTACTTTACCGAGTAAGCGACCGTGAGTGAGGGTAAGTTGCCTTAA
# prediction: 0
# input sequence: TGACAGGTGCGCCTTTGATCTACGTAAAAAGGTGTCGAACATGTCCGCTAGAAGCGCCAGGCTAGACACTGTGTGTGACTTATACCGGGGTCTATGGTTA
# prediction: 1
# input sequence: TACGAGCGGCCCGATGAAAAGTAGCTCTGACAACCGTGCGCCGGGGGGCTACAACATCCTTGGTATAAGGTCTCGATGCCATGATGATCTATAGTTAATC
# prediction: 0

 

まとめと展望・ゲノム解析を越えて

前回のBlogで、HyenaDNAというLLMでDNAのシークエンスを分析するモデルを紹介しました。今回はその実践編として公開されているHyenaDNAのコードと事前学習済みのモデル・パラメータを利用した実行方法を簡単に紹介しました。このようにステップごとに見てみると、データはDNA配列とあまり馴染みないものではありますが、通常の機械学習のフレームワークとして扱えることがわかります。

さて、遺伝子の研究における1つのマイルストーンのあるヒトゲノム計画では、1990年当時に15ヵ年(2005年)を目標にヒトの全てのゲノム配列の解明するために開始されました。実際には技術の進歩と他のグループとの競争により計画は加速し、概要版が2000年に、完成版が2003年に発表されました。当時、ヒトゲノムの解析には1億ドルもの膨大なコストがかかっていましたが、次世代シークエンサー(NGS)の技術革新のために、現在では1,000ドル以下でまでコストが下がっています。(驚くべきことにムーアの法則を上回る脅威的なスピードでコストが下がっています。)

National Human Genome Research Institute The Cost of Sequencing a Human Genomeより引用

遺伝子配列の解析が安価かつ容易に行えるようになったことで、分析されるデータ量がこれまで以上に増えると期待されます。これは、遺伝子情報の利用を促進し、新たな研究や発見を生む可能性を秘めています。特に注目すべきは、Deep Learningの応用で、活発に研究が進められております(Awesome Deep Learning Single Cell Papers)。

しかし、ただの遺伝子情報を持っているだけでは、生命の全ての現象を説明することはできません。 我々の体は約37兆2000億個もの細胞(注: 身長172cm、体重70kgの30歳男性の推定値)からできていると言われています(はたらく細胞冒頭ナレーションより)。 これらの膨大な数の細胞は赤血球や白血球、肝細胞、筋細胞、神経細胞等、それぞれの機能に応じて分化しています。 遺伝子配列は共通ですが、各細胞で異なる遺伝子が複雑に作用し細胞の多様性を生み出しています(注;なお全細胞の3分の2を占める赤血球は成熟の過程で核やミトコンドリアなどの器官を失っています)。それらを解明するための細胞単位での遺伝子の転写物(Transcript)をその全て(Transcriptome)包括的に分析する研究領域はTranscriptomicsと呼ばれます。 さらには、全タンパク質を分析するProteomics、代謝物を分析するMetabolomicsなどの分野があります。 これらのオミクス(ome(すべての・完全) + ics(学問))と総称される研究領域は、それぞれに大量のデータが生成されることから、データサイエンスの活用が期待されています。Deep Learningなどの技術の応用により、生命現象をより深く理解することができると期待されています。

グループ研究開発本部 AI研究開発室では、データサイエンティスト/機械学習エンジニアを募集しています。ビッグデータの解析業務などAI研究開発室にご興味を持って頂ける方がいらっしゃいましたら、ぜひ募集職種一覧からご応募をお願いします。皆さんのご応募をお待ちしています。

参考資料

  • Twitter
  • Facebook
  • はてなブックマークに追加

グループ研究開発本部の最新情報をTwitterで配信中です。ぜひフォローください。

 
  • AI研究開発室
  • 大阪研究開発グループ

関連記事